使用 ADFS OAuth 刷新令牌

Posted

技术标签:

【中文标题】使用 ADFS OAuth 刷新令牌【英文标题】:Using ADFS OAuth Refresh Token 【发布时间】:2017-06-24 02:27:00 【问题描述】:

我已将 ADFS3 OAuth2 配置为返回刷新令牌:

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

这里访问令牌持续 10 分钟,刷新令牌持续 480 分钟。

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

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

并发布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 来获取另一个访问令牌?即:

网址是什么? 我们发帖吗? 我们使用什么参数名称来发布refresh_token

【问题讨论】:

【参考方案1】:

刷新令牌授予类型也会针对您用来交换授权码的令牌端点执行。您应该根据 RFC:https://www.rfc-editor.org/rfc/rfc6749#section-6 使用 POST,并至少提供参数 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...>

【讨论】:

以上是关于使用 ADFS OAuth 刷新令牌的主要内容,如果未能解决你的问题,请参考以下文章

使用 AD FS 4.0 (2016) 或更高版本获取新的刷新令牌

OAUTH2 刷新令牌

即使访问令牌有效,也无法使用刷新令牌刷新 Google OAuth2 的访问令牌

OAuth - 在“社交登录”中使用刷新令牌

OAuth 客户端凭据重新颁发访问令牌与刷新令牌

从passportjs中的刷新令牌获取oauth访问令牌