我目前在移动应用程序中使用 OpenID Connect/Oauth2 Implicit Flow。我正在为用户提供一个 Web 视图来登录并获取访问令牌和到期时间。但是,当访问令牌过期时,我需要要求用户重新登录吗?或者有没有一种方法可以使用当前的访问令牌静默获取新的访问令牌,而不会打扰用户。我想另一种选择是将令牌到期时间设置为非常长的时间,但我读过这是一个坏主意。
我在这里错过了什么吗?
我目前在移动应用程序中使用 OpenID Connect/Oauth2 Implicit Flow。我正在为用户提供一个 Web 视图来登录并获取访问令牌和到期时间。但是,当访问令牌过期时,我需要要求用户重新登录吗?或者有没有一种方法可以使用当前的访问令牌静默获取新的访问令牌,而不会打扰用户。我想另一种选择是将令牌到期时间设置为非常长的时间,但我读过这是一个坏主意。
我在这里错过了什么吗?
由于隐式流不发送刷新令牌(如RFC6746第 9 节所述),因此无法使用刷新令牌。但作为一种解决方法,可以使用客户端凭据授予来获取访问令牌。
一个可行的解决方案是首先遵循隐式流程并验证客户端。然后客户端身份验证授权可用于执行所需的 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
示例响应(来自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"
}
PS -
如果您使用的是授权码流,您可以使用它refresh_token
来获取新的访问令牌。可以从OAuth2 文档中获得如何形成请求。请注意,为此,您的授权响应应包含一个`refresh_token。
刷新令牌应该像用户凭证一样受到保护。可以从这里的 keycloak 文档中阅读更多内容
示例请求和响应(来自RFC6749)
要求
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
}
推荐的方法是使用外部浏览器和授权代码流。检查OAuth 2.0 for Native Apps RFC。对于 Android,还有一个支持库AppAuth。使用此流程,您可以使用刷新令牌来获取新的访问令牌,但是客户端密码存在问题(通常需要访问 /token 端点),因为您无法在移动应用程序中保证它的安全(在RFC)。
如果您决定坚持使用不安全的 WebView 和隐式流(您的应用程序可以看到密码),您可以使用与 JavaScript 应用程序中相同的技术 - 请求带有/auth?...&prompt=none
URL 的新令牌,这将在不询问的情况下返回新令牌如果用户在那里仍然有一个打开的会话,则用户获取凭据。