OAuth2 密码授予和基本身份验证

Posted

技术标签:

【中文标题】OAuth2 密码授予和基本身份验证【英文标题】:OAuth2 password grant and Basic Authentication 【发布时间】:2017-09-18 01:32:14 【问题描述】:

我正在开发一种解决方案,它具有:授权服务器 (AS)、资源服务器和两个客户端。这两个客户端是:一个带有 Angular 2 的 Web 应用程序和一个带有 Angular 2 + Ionic 2 的移动应用程序。我已经开始按照这个示例开发授权服务器 https://github.com/Baeldung/spring-security-oauth

对于这两个客户端,我决定使用“密码代码授予”,因为客户端受 AS 信任。

但现在我在应用程序上存储“客户端密码”时遇到了问题。因为 API (.../oauth/token) 受到基本身份验证的保护,所以每次我向 AS 询问令牌时,我都需要发送类似的内容:

curl.exe -v -u client_id:client_secret http://localhost:8080/backend/oauth/token -d grant_type=password -d client_id=client_id -d username=admin -d password=admin

所以,问题是:

    我可以在哪里安全地存储应用程序中的客户端密码? 从 oauth API 中删除基本身份验证是否安全? 我是否使用了其他代码授权类型?

谢谢你, 保罗

【问题讨论】:

【参考方案1】:

在浏览器 (Angular) 中运行的应用程序无法保证其机密安全,因此我会选择 OAuth2 隐式流程。隐式流程需要使用 HTTPS 与您的授权服务器进行通信,因为令牌是通过网络传输的。

您不应该从令牌端点删除身份验证 - 它会危及其他流类型。例如,授权授予流程不要求客户端由 HTTPS 提供服务,并且任何人都可以看到身份验证代码,因此令牌端点机密在那里很重要(资源服务器必须使用 HTTPS 请求令牌)。

使用隐式流程,您必须检查访问令牌的有效时间,并在当前令牌过期之前请求新的令牌。例如使用prompt=none auth 请求参数。

【讨论】:

以上是关于OAuth2 密码授予和基本身份验证的主要内容,如果未能解决你的问题,请参考以下文章

OpenId 连接和 OAuth 2.0 密码授予 - 有啥区别?

OAuth2:JWT授权授予和客户端凭据授权与JWT客户端身份验证之间的区别是什么?

Grails OAuth2 登录密码凭据授予返回 invalid_client

Spring Boot webservice (REST) - 如何将 JUnit 5 测试从基本身份验证更改为 OAuth2 (Keycloak)

使用 Laravel Passport 获取经过身份验证的用户并授予密码

如何使用 OAuth2 身份验证设置 traefik