由于缺少Refresh Token,Client Credential Grant在AuthorizeRequest上失败

时间:2012-04-05 14:47:09

标签: dotnetopenauth

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

我想我可以通过继承ClientBase并重写AuthorizeRequest来解决。这是正确的做法吗?

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

Edit2:刚刚阅读了DotNetOpenAuth.OAuth2.AuthorizationServer.PrepareAccessTokenRequest中提到的OAuth 2规范草案(草案25),我无法找到它禁止客户端凭据授予类型的刷新令牌的位置。也许他们改变了吗?

2 个答案:

答案 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请求。

请参阅Google Documentation

答案 1 :(得分:2)

我不确定你为什么说ClientBase.AuthorizeRequest需要它。首先,存在一个仅带有访问令牌的重载,因此它甚至不会询问刷新令牌。您可能尝试的重载接受IAuthorizationState对象,该对象可能包含或不包含刷新令牌,并且看起来该方法仅在访问令牌过期时查找刷新令牌。由于无法使用过期的访问令牌,因此它会尝试刷新它并在其无法启动时抛出。这对我来说似乎很合理。

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

OAuth 2规范草案25确实表明刷新令牌不应包含在对客户端凭据授予的响应中。来自section 4.4.3

  

4.4.3。访问令牌响应

     

如果访问令牌请求有效且已获得授权,则授权服务器会发出访问令牌,如第5.1节所述。 不应包含刷新令牌。如果请求未通过客户端身份验证或无效,则授权服务器将返回错误响应,如第5.2节中所述。