使用gdata的托管域的Google数据API OAuth认证失败
我正在创建一个Django应用程序,目的是为用户创建一个日历和一个Google文档文件夹,并通过API来插入事件和添加文档。几个月前,这个功能运行得很好;现在我正在对我的代码进行大规模重构,在测试这些组件时,我发现它们不再工作了!当我尝试创建文件夹或日历时,API给我的回复是:
RequestError: {'status': 401, 'body': '<HTML>\n<HEAD>\n<TITLE>Unknown authorization header</TITLE>\n</HEAD>\n<BODY BGCOLOR="#FFFFFF" TEXT="#000000">\n<H1>Unknown authorization header</H1>\n<H2>Error 401</H2>\n</BODY>\n</HTML>\n', 'reason': 'Unknown authorization header'}
我的代码是这样的——基于Google文档中的这个例子(文档中的代码比较简短,所以我会贴那个,尽管认证部分实际上是两个代码都共有的一个函数):
from gdata.auth import OAuthSignatureMethod, OAuthToken, OAuthInputParams
from gdata.calendar.service import CalendarService
from django.conf import settings
client_instance = CalendarService()
client_instance.SetOAuthInputParameters(OAuthSignatureMethod.HMAC_SHA1,
settings.OAUTH_CONSUMER_KEY,
consumer_secret=settings.OAUTH_CONSUMER_SECRET)
user_tokens = UserToken.objects.get(user=user)
if not user_tokens.oauth_access_token_value or not user_tokens.oauth_valid_token:
raise Exception('The user has not allowed us to access his services')
oauth_token=OAuthToken(key=user_tokens.oauth_access_token_value, secret=user_tokens.oauth_access_token_secret)
oauth_token.oauth_input_params = OAuthInputParams(OAuthSignatureMethod.HMAC_SHA1,
settings.OAUTH_CONSUMER_KEY,
consumer_secret=settings.OAUTH_CONSUMER_SECRET)
client_instance.SetOAuthToken(oauth_token)
new_folder = docs_service.CreateFolder("some folder")
这个异常是从最后一行抛出来的,API是不是有什么变化,还是说只是我出错了?(我觉得可能只是我出错了,但我看不出来,因为几个月前它还好好的)
1 个回答
0
原因在于返回的json信息中显示:'reason': '未知的授权头'
一个可能的原因是你电脑的本地时间。请确保你电脑上的时间是正确的,因为oauth会用当前的unix时间戳来签名和验证请求。你可以查看谷歌支持论坛了解更多信息。
这里有一些记录下来的bug列表。第一个似乎很符合你的情况:
希望这些信息对你有帮助 :)