如何在OpenID Connect/OAuth2隐式流中获取新的访问令牌

0pizxfdo  于 2023-08-02  发布在  其他
关注(0)|答案(2)|浏览(104)

我目前正在移动的应用程序中使用OpenID Connect/Oauth2隐式流。我正在为用户打开一个Web视图,以便登录并获取访问令牌和到期时间。但是,当访问令牌过期时,我是否需要要求用户重新登录?或者有没有一种方法可以使用当前的令牌悄悄地获得新的访问令牌,而不会窃听用户。我想另一种选择是将令牌过期时间设置为非常长的时间,但我已经读到这是一个坏主意。
我错过了什么吗?

dxxyhpgq

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。

刷新令牌应该像用户的凭据一样受到保护。更多内容可从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
}

eit6fx6z

eit6fx6z2#

建议使用外部浏览器和授权代码流。检查OAuth 2.0 for Native Apps RFC。对于Android,还有一个支持库AppAuth。通过此流程,您可以使用刷新令牌来获取新的访问令牌,但客户端密码(通常用于访问/令牌端点)存在问题,因为您无法在移动的应用中保持其安全(RFC中对此进行了描述)。
如果你决定坚持使用WebView和隐式流,这是不安全的(你的应用程序可以看到密码),你可以使用与JavaScript应用程序相同的技术--用/auth?...&prompt=none URL请求一个新令牌,如果用户仍然有一个打开的会话,它将返回一个新令牌,而不要求用户提供凭据。

相关问题