使用 ADFS OAuth 刷新令牌

Using ADFS OAuth Refresh Token

我将 ADFS3 OAuth2 配置为 return 刷新令牌:

PS> Set-AdfsRelyingPartyTrust -TargetName "RPT Name" -IssueOAuthRefreshTokensTo AllDevices
PS> Set-AdfsRelyingPartyTrust -TargetName "RPT Name" -TokenLifetime 10
PS> Set-AdfsProperties -SSOLifetime 480

此处访问令牌持续 10 分钟,刷新令牌持续 480 分钟。

然后我通过 GETing 生成访问令牌:

https://myadfsdomain/adfs/oauth/authorize
    ?response_type=code
    &client_id=MYCLIENTID
    &redirect_uri=https://myserver/callback
    &resource=MYRelyingPartyId

和 POST 对 responseCode 例如:

$http({method: "post", 
       headers: {'Content-Type': 'application/x-www-form-urlencoded'}, 
       url: "https://myadfsdomain/adfs/oauth2/token", 
       data: "client_id=MYCLIENTID&code=" + responseCode + "&redirect_uri=https://myserver/callback&grant_type=authorization_code"  })

响应具有访问令牌、类型、过期时间和刷新令牌:

{"access_token":"blah...",
 "token_type":"bearer",
 "expires_in":600,
 "refresh_token":"blahblah..."}

太棒了。无论配置了多长时间(此处为 10 分钟),访问令牌现在都有效

问题是,一旦该时间到期,我们如何使用 refresh_token 获取另一个访问令牌?即:

刷新令牌授予类型也会针对您用于交换授权代码的令牌端点执行。您应该根据 RFC 使用 POST:https://www.rfc-editor.org/rfc/rfc6749#section-6 并至少提供参数 grant_typerefresh_token。一个示例,基于 RFC 中的示例:

POST /adfs/oauth2/token HTTP/1.1
Host: myadfsdomain
Content-Type: application/x-www-form-urlencoded

grant_type=refresh_token&refresh_token=<blahblah...>