我目前正在移动应用中使用OpenID Connect / Oauth2 Implicit Flow . 我正在为用户提供Web视图以登录并获取访问令牌和到期日期 . 但是,当访问令牌过期时,是否需要让用户再次登录?或者有没有办法使用当前的方式静默获取新的访问令牌,而不会窃听用户 . 我想另一个选择是将令牌到期设置为很长时间,但我已经读到这是一个坏主意 .
我在这里错过了什么吗?
由于隐式流不发送刷新令牌(如RFC6746的section 9中所述),因此无法使用刷新令牌 . 但作为一种解决方法,可以使用client credential grant来获取访问令牌 .
一个可行的解决方案是首先遵循隐式流并验证客户端 . 然后 client authentication grant 可用于执行所需的API调用 .
样品申请(来自RFC6749)
POST /token HTTP/1.1 Host: server.example.com Authorization: Basic czZCaGRSa3F0MzpnWDFmQmF0M2JW Content-Type: application/x-www-form-urlencoded rant_type=client_credentials
样本resposne(来自RFC6749)
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 - 如果您使用的是 authorization code flow ,则可以使用 refresh_token 获取新的访问令牌 . 如何形成请求可以从OAuth2 documentation获得 . 请注意,为此,您的授权响应应包含`refresh_token .
refresh_token
应该保护刷新令牌与用户的凭证一样有 Value . 更多信息可以从here的keycloak文档中读取
样品申请和回复(来自RFC6749)
Request
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
Response
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 }
建议的方法是使用外部浏览器和授权代码流程 . 检查OAuth 2.0 for Native Apps RFC . 对于Android,还有一个支持库AppAuth . 通过此流程,您可以使用刷新令牌来获取新的访问令牌,但是客户端密钥存在问题(通常需要访问/令牌 endpoints ),因为您无法在移动应用程序中保持安全(它在RFC) .
如果您决定坚持使用WebView和Implicit Flow(这是不安全的(您的应用程序可以看到密码),您可以使用与JavaScript应用程序相同的技术 - 请求一个带有 /auth?...&prompt=none URL的新令牌,该令牌将返回一个新的令牌如果用户仍然在那里打开会话,则要求用户提供凭据 .
/auth?...&prompt=none
2 回答
由于隐式流不发送刷新令牌(如RFC6746的section 9中所述),因此无法使用刷新令牌 . 但作为一种解决方法,可以使用client credential grant来获取访问令牌 .
一个可行的解决方案是首先遵循隐式流并验证客户端 . 然后 client authentication grant 可用于执行所需的API调用 .
样品申请(来自RFC6749)
样本resposne(来自RFC6749)
P.S - 如果您使用的是 authorization code flow ,则可以使用
refresh_token
获取新的访问令牌 . 如何形成请求可以从OAuth2 documentation获得 . 请注意,为此,您的授权响应应包含`refresh_token .应该保护刷新令牌与用户的凭证一样有 Value . 更多信息可以从here的keycloak文档中读取
样品申请和回复(来自RFC6749)
Request
Response
建议的方法是使用外部浏览器和授权代码流程 . 检查OAuth 2.0 for Native Apps RFC . 对于Android,还有一个支持库AppAuth . 通过此流程,您可以使用刷新令牌来获取新的访问令牌,但是客户端密钥存在问题(通常需要访问/令牌 endpoints ),因为您无法在移动应用程序中保持安全(它在RFC) .
如果您决定坚持使用WebView和Implicit Flow(这是不安全的(您的应用程序可以看到密码),您可以使用与JavaScript应用程序相同的技术 - 请求一个带有
/auth?...&prompt=none
URL的新令牌,该令牌将返回一个新的令牌如果用户仍然在那里打开会话,则要求用户提供凭据 .