我目前正在移动的应用程序中使用OpenID Connect/Oauth2隐式流。我正在为用户打开一个Web视图,以便登录并获取访问令牌和到期时间。但是,当访问令牌过期时,我是否需要要求用户重新登录?或者有没有一种方法可以使用当前的令牌悄悄地获得新的访问令牌,而不会窃听用户。我想另一种选择是将令牌过期时间设置为非常长的时间,但我已经读到这是一个坏主意。我错过了什么吗?
dxxyhpgq1#
由于隐式流不发送刷新令牌(如RFC 6746的第9节中所解释的),因此不可能使用刷新令牌。但作为一种解决方法,可以使用客户端凭据授予来获得访问令牌。一个可行的解决方案是首先遵循隐式流并对客户端进行身份验证。然后客户端鉴权授权就可以进行所需的API调用了。示例请求(来自RFC 6749)
POST /token HTTP/1.1 Host: server.example.com Authorization: Basic czZCaGRSa3F0MzpnWDFmQmF0M2JW Content-Type: application/x-www-form-urlencoded grant_type=client_credentials
字符串样本响应(来自RFC 6749)
HTTP/1.1 200 OK Content-Type: application/json;charset=UTF-8 Cache-Control: no-store Pragma: no-cache { "access_token":"2YotnFZFEjr1zCsicMWpAA", "token_type":"example", "expires_in":3600, "example_parameter":"example_value" }
型
**P.S -**如果您使用的是 * 授权码流 *,可以使用refresh_token获取新的访问令牌。如何形成请求可以从OAuth2文档中获得。请注意,要执行此操作,您的授权响应应包含`refresh_token。
refresh_token
刷新令牌应该像用户的凭据一样受到保护。更多内容可从here的keycloak文档中阅读示例请求和响应(来自RFC 6749)
申请
POST /token HTTP/1.1 Host: server.example.com Authorization: Basic czZCaGRSa3F0MzpnWDFmQmF0M2JW Content-Type: application/x-www-form-urlencoded grant_type=refresh_token&refresh_token=tGzv3JOkF0XG5Qx2TlKWIA
回复
HTTP/1.1 200 OK Content-Type: application/json Cache-Control: no-store Pragma: no-cache { "access_token": "TlBN45jURg", "token_type": "Bearer", "refresh_token": "9yNOxJtZa5", "expires_in": 3600 }
eit6fx6z2#
建议使用外部浏览器和授权代码流。检查OAuth 2.0 for Native Apps RFC。对于Android,还有一个支持库AppAuth。通过此流程,您可以使用刷新令牌来获取新的访问令牌,但客户端密码(通常用于访问/令牌端点)存在问题,因为您无法在移动的应用中保持其安全(RFC中对此进行了描述)。如果你决定坚持使用WebView和隐式流,这是不安全的(你的应用程序可以看到密码),你可以使用与JavaScript应用程序相同的技术--用/auth?...&prompt=none URL请求一个新令牌,如果用户仍然有一个打开的会话,它将返回一个新令牌,而不要求用户提供凭据。
/auth?...&prompt=none
2条答案
按热度按时间dxxyhpgq1#
由于隐式流不发送刷新令牌(如RFC 6746的第9节中所解释的),因此不可能使用刷新令牌。但作为一种解决方法,可以使用客户端凭据授予来获得访问令牌。
一个可行的解决方案是首先遵循隐式流并对客户端进行身份验证。然后客户端鉴权授权就可以进行所需的API调用了。
示例请求(来自RFC 6749)
字符串
样本响应(来自RFC 6749)
型
**P.S -**如果您使用的是 * 授权码流 *,可以使用
refresh_token
获取新的访问令牌。如何形成请求可以从OAuth2文档中获得。请注意,要执行此操作,您的授权响应应包含`refresh_token。刷新令牌应该像用户的凭据一样受到保护。更多内容可从here的keycloak文档中阅读
示例请求和响应(来自RFC 6749)
申请
型
回复
型
eit6fx6z2#
建议使用外部浏览器和授权代码流。检查OAuth 2.0 for Native Apps RFC。对于Android,还有一个支持库AppAuth。通过此流程,您可以使用刷新令牌来获取新的访问令牌,但客户端密码(通常用于访问/令牌端点)存在问题,因为您无法在移动的应用中保持其安全(RFC中对此进行了描述)。
如果你决定坚持使用WebView和隐式流,这是不安全的(你的应用程序可以看到密码),你可以使用与JavaScript应用程序相同的技术--用
/auth?...&prompt=none
URL请求一个新令牌,如果用户仍然有一个打开的会话,它将返回一个新令牌,而不要求用户提供凭据。