在过去的几天里,我花了一些时间来尝试为我的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)的结果是真的。问题是当我调用这行代码时:
_service.Tasklists.List().Fetch();它从google返回一个(401)未经授权的错误。我正在调查原因,但我不确定如何继续,我在这个功能上的时间很短。任何建议都将不胜感激。谢谢!
发布于 2013-05-16 02:03:20
似乎只是将代码放在这里的行为总是帮助我更快地弄清楚它:)
现在看起来这一行是不必要的:
return client.ProcessUserAuthorization();将其从GetAuthorization方法中删除并仅返回传递给RefreshToken的状态就解决了未经授权的错误。我把这个问题留下来,以防它难倒其他任何人。
https://stackoverflow.com/questions/16571693
复制相似问题