DotNetOpenAuth谷歌API离线访问

本文关键字:访问 离线 API 谷歌 DotNetOpenAuth | 更新日期: 2023-09-27 18:13:58

在过去的几天里,我花了一些时间试图为我的web应用程序实现一个功能。该功能应该在用户离线时向谷歌日历添加新事件。我阅读了web服务器应用程序的Google OAuth2文档,似乎理解了它的基础知识。我创建了一个链接来授权应用程序进行离线访问:

    <a target='_blank' href='https://accounts.google.com/o/oauth2/auth?scope=https%3A%2F%2Fwww.googleapis.com%2Fauth%2Ftasks&response_type=code&client_id=<MY CLIENT ID>&access_type=offline&redirect_uri=http%3A%2F%2Flocalhost:49949%2Foauth2callback.aspx'>Grant Tasks Permission</a>

如果用户接受,那么我在重定向uri处捕获刷新令牌,如下所示:

    private static OAuth2Authenticator<WebServerClient> _authenticator;
    protected void Page_Load(object sender, EventArgs e)
    {
        if (HttpContext.Current.Request["code"] != null)
        {
            _authenticator = CreateAuthenticator();
            _authenticator.LoadAccessToken();
        }
        Response.Write("Refresh Token: " + _authenticator.State.RefreshToken);
    }
    private OAuth2Authenticator<WebServerClient> CreateAuthenticator()
    {
        var provider = new WebServerClient(GoogleAuthenticationServer.Description);
        provider.ClientIdentifier = "<MY CLIENT ID>";
        provider.ClientSecret = "<MY CLIENT SECRET>";
        return new OAuth2Authenticator<WebServerClient>(provider, GetAuthorization);
    }
    private IAuthorizationState GetAuthorization(WebServerClient client)
    {
        return client.ProcessUserAuthorization(new HttpRequestInfo(HttpContext.Current.Request));
    }

出于测试目的,我一直将刷新令牌复制到一个文本文件中以供进一步使用。

我的问题是使用这个刷新令牌离线访问。我一直在使用以下代码来刷新令牌:

    protected void btnGetTasks_Click(object sender, EventArgs e)
    {
        if (_service == null)
        {
            _authenticator = CreateAuthenticator();
            _service = new TasksService(new BaseClientService.Initializer() { Authenticator = _authenticator });
        }
        var cl = _service.Tasklists.List().Fetch();
    }
    private OAuth2Authenticator<WebServerClient> CreateAuthenticator()
    {
        // Register the authenticator.
        var provider = new WebServerClient(GoogleAuthenticationServer.Description);
        provider.ClientIdentifier = "<MY CLIENT ID>";
        provider.ClientSecret = "<MY CLIENT SECRET>";
        var authenticator = new OAuth2Authenticator<WebServerClient>(provider, GetAuthorization);
        return authenticator;
    }
    private IAuthorizationState GetAuthorization(WebServerClient client)
    {                      
        string scope = "https://www.googleapis.com/auth/tasks";
        IAuthorizationState state = new AuthorizationState(new[] { scope });
        state.RefreshToken = "<REFRESH TOKEN FROM FIRST STEP>";
        var result = client.RefreshToken(state);
        return client.ProcessUserAuthorization();
    }

现在一切似乎都很好。当我逐步执行代码时,我可以看到client.RefreshToken(state)的结果为true。问题是当我调用这行代码时:

_service.Tasklists.List().Fetch();

返回来自google的(401)未经授权的错误。我正在调查的原因,但我不知道如何进行,我运行的时间短与此功能。任何建议都将非常感激。谢谢!

DotNetOpenAuth谷歌API离线访问

似乎只是把代码放在这里的行为总是帮助我更快地弄清楚:)

现在看来这行是不必要的:

return client.ProcessUserAuthorization();

将其从GetAuthorization方法中删除,只返回传递给RefreshToken的状态就解决了未经授权的错误。我把这个问题留在这里,以防有谁被它难住了。