首页 文章

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

提问于
浏览
5

我目前正在移动应用中使用OpenID Connect / Oauth2 Implicit Flow . 我正在为用户提供Web视图以登录并获取访问令牌和到期日期 . 但是,当访问令牌过期时,是否需要让用户再次登录?或者有没有办法使用当前的方式静默获取新的访问令牌,而不会窃听用户 . 我想另一个选择是将令牌到期设置为很长时间,但我已经读到这是一个坏主意 .

我在这里错过了什么吗?

2 回答

  • 3

    由于隐式流不发送刷新令牌(如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 .

    应该保护刷新令牌与用户的凭证一样有 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
    }
    
  • 1

    建议的方法是使用外部浏览器和授权代码流程 . 检查OAuth 2.0 for Native Apps RFC . 对于Android,还有一个支持库AppAuth . 通过此流程,您可以使用刷新令牌来获取新的访问令牌,但是客户端密钥存在问题(通常需要访问/令牌 endpoints ),因为您无法在移动应用程序中保持安全(它在RFC) .

    如果您决定坚持使用WebView和Implicit Flow(这是不安全的(您的应用程序可以看到密码),您可以使用与JavaScript应用程序相同的技术 - 请求一个带有 /auth?...&prompt=none URL的新令牌,该令牌将返回一个新的令牌如果用户仍然在那里打开会话,则要求用户提供凭据 .

相关问题