1

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

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

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

Edit2:只需阅读 DotNetOpenAuth.OAuth2.AuthorizationServer.PrepareAccessTokenRequest 中提到的 OAuth 2 规范草案(草案 25),我找不到它在哪里不允许客户端凭据授予类型的刷新令牌。也许他们改变了它?

4

2 回答 2

3

如果您请求,Google 会返回刷新令牌。在查询字符串 access_type=offline 中提供参数。

就我而言,我必须将默认授权端点 URL 修改为:https ://accounts.google.com/o/oauth2/auth?access_type=offline

使用DotNetOpenAuth 的Google Api C# 示例:

    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
            );
    }

根据我的经验,这仅适用于第一个请求。

请参阅谷歌文档

于 2012-04-25T11:36:04.313 回答
2

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

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

OAuth 2 规范草案 25 实际上表明刷新令牌不应包含在对客户端凭据授予的响应中。从第 4.4.3 节

4.4.3. 访问令牌响应

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

于 2012-04-07T05:35:54.780 回答