客户机凭证格兰特的AuthorizeRequest失败,由于缺乏刷新令牌

客户端证书授予不返回刷新令牌(DotNetOpenAuth.OAuth2.AuthorizationServer.PrepareAccessTokenRequest禁止它)。 但ClientBase.AuthorizeRequest需要它。 这是DotNetOpenAuth或错误我​​做错了什么?

我想我可以通过继承ClientBase和压倒一切的AuthorizeRequest解决。 那是正确的事是什么?

编辑:这不是那么容易自ClientBase继承DotNetOpenAuth之外,因为很多你想要的东西是唯一的内部。 例如ErrorUtilities.VerifyProtocol

EDIT2:刚才看了OAuth的2规范草案(草案25)中提到的DotNetOpenAuth.OAuth2.AuthorizationServer.PrepareAccessTokenRequest,我无法找到它不允许客户端凭证交付式刷新令牌。 也许他们改变了呢?

--------------解决方案-------------

我不知道为什么你说ClientBase.AuthorizeRequest需要它。 首先,有一个重载只需要一个访问令牌,所以它甚至不要求一个刷新令牌。 你可能已经尝试过载接受一个IAuthorizationState对象,这可能会或可能不包括刷新令牌,它看来,如果访问令牌已过期该方法只查找刷新令牌。 由于过期的访问令牌不能用,它会尝试刷新它,如果它不能抛出。 这似乎是合理的我。

无论您选择哪种方法重载调用,您的电话模式必须要么避免使用过期的访问令牌或者是准备当DotNetOpenAuth或资源服务器确定他们是过期或撤销所引发的异常反应。 事实上,因为令牌可以在到期前被撤销,它总是被做好这样的准备是一个好主意。

基于OAuth的认证2规范草案25日在事实上确实表明,刷新令牌不应该被包括在给客户的凭证给予响应。 从第4.4.3节:

4.4.3。 访问令牌响应

如果访问令牌请求是有效的授权,如第5.1节所述的授权服务器发出一个访问令牌。 刷新令牌不应列入 。 如果请求失败客户端身份验证或者是无效的,如第5.2节所述的授权服务器返回一个错误响应。

谷歌如果你要求它返回刷新令牌。 提供查询字符串ACCESS_TYPE =离线参数。

在我而言,我不得不修改默认授权端点的URL:https://accounts.google.com/o/oauth2/auth?access_type=offline

谷歌阿比下使用DotNetOpenAuth#示例:

private WebServerClient GetClient()
{
return new WebServerClient(
new AuthorizationServerDescription
{
AuthorizationEndpoint = new Uri("https://accounts.google.com/o/oauth2/auth?access_type=offline"),
TokenEndpoint = new Uri("https://accounts.google.com/o/oauth2/token"),
ProtocolVersion = ProtocolVersion.V20,
},
clientIdentifier: this.settings.GoogleApisClientIdentifier,
clientSecret: this.settings.GoogleApisClientSecret
);
}

从我的经验注:这仅适用于第一次请求。

见谷歌文档。

分类:dotnetopenauth 时间:2015-03-15 人气:0
本文关键词: dotnetopenauth
分享到:

相关文章

Copyright (C) 55228885.com, All Rights Reserved.

55228885 版权所有 京ICP备15002868号

processed in 0.239 (s). 10 q(s)