由于隐式流不发送刷新令牌(如 RFC6746 的 section 9 中所述),因此无法使用刷新令牌。但作为一种解决方法,可以使用client credential 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
响应示例(来自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"
}
附言-
如果您使用授权码流,您可以使用refresh_token 获取新的访问令牌。可以从OAuth2 documentation 获得如何形成请求。请注意,为此,您的授权响应应包含一个`refresh_token。
刷新令牌应该像用户凭证一样受到保护。更多可以从here的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
}