客户端凭据授予不返回刷新令牌(DotNetOpenAuth.OAuth2.AuthorizationServer.PrepareAccessTokenRequest禁止它)。但ClientBase.AuthorizeRequest需要它。 这是DotNetOpenAuth中的错误还是我做错了什么?
我想我可以通过继承ClientBase并重写AuthorizeRequest来解决。这是正确的做法吗?
编辑:从DotNetOpenAuth之外的ClientBase继承并不是那么容易,因为你想要的很多东西只是内部的。例如ErrorUtilities.VerifyProtocol
Edit2:刚刚阅读了DotNetOpenAuth.OAuth2.AuthorizationServer.PrepareAccessTokenRequest中提到的OAuth 2规范草案(草案25),我无法找到它禁止客户端凭据授予类型的刷新令牌的位置。也许他们改变了吗?
答案 0 :(得分:3)
如果您要求,Google会返回刷新令牌。在查询字符串中提供参数access_type = offline。
在我的情况下,我必须将默认的授权端点URL修改为:https://accounts.google.com/o/oauth2/auth?access_type=offline
Google Api C#示例使用 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
);
}
根据我的经验注意:这仅适用于First请求。
答案 1 :(得分:2)
我不确定你为什么说ClientBase.AuthorizeRequest
需要它。首先,存在一个仅带有访问令牌的重载,因此它甚至不会询问刷新令牌。您可能尝试的重载接受IAuthorizationState
对象,该对象可能包含或不包含刷新令牌,并且看起来该方法仅在访问令牌过期时查找刷新令牌。由于无法使用过期的访问令牌,因此它会尝试刷新它并在其无法启动时抛出。这对我来说似乎很合理。
无论您选择调用哪种方法重载,您的调用模式都必须避免使用过期的访问令牌,或者准备好响应DotNetOpenAuth或资源服务器确定它们已过期或撤销时引发的异常。事实上,因为令牌在到期之前可以被撤销,所以总是为此做好准备是个好主意。
OAuth 2规范草案25确实表明刷新令牌不应包含在对客户端凭据授予的响应中。来自section 4.4.3:
4.4.3。访问令牌响应
如果访问令牌请求有效且已获得授权,则授权服务器会发出访问令牌,如第5.1节所述。 不应包含刷新令牌。如果请求未通过客户端身份验证或无效,则授权服务器将返回错误响应,如第5.2节中所述。