【发布时间】:2013-04-13 17:04:55
【问题描述】:
我有以下测试程序:
from rauth.service import OAuth1Service, OAuth2Service
SUPPORTED_SERVICES = {
'twitter' : ( 'OAuth1', 'twitter', 'https://api.twitter.com/oauth', 'request_token', 'access_token', 'authorize', 'https://api.twitter.com/1/', None),
'facebook' : ( 'OAuth2', 'facebook', 'https://graph.facebook.com/oauth', None, 'access_token', 'authorize', 'https://graph.facebook.com/', 'https://www.facebook.com/connect/login_success.html'),
'google' : ( 'OAuth2', 'google', 'https://accounts.google.com/o/oauth2', None, 'token', 'auth', None, 'http://localhost'),
}
CLIENT_DATA = {
'twitter' : ('dummy_client_id', 'dummy_client_secret'),
'facebook' : ('dummy_client_id', 'dummy_client_secret'),
'google' : ('dummy_client_id', 'dummy_client_secret'),
}
USER_TOKENS = {
'user1' : {
'twitter' : ('dummy_access_token', 'dummy_access_token_secret'),
'facebook' : ('dummy_access_token', None),
'google' : ('dummy_access_token', None),
}
}
def test_google(user_id):
service_id = 'google'
oauthver, name, oauth_base_url, request_token_url, access_token_url, authorize_url, base_url, redirect_uri = SUPPORTED_SERVICES[service_id]
request_token_url = oauth_base_url + '/' + (request_token_url or '')
access_token_url = oauth_base_url + '/' + access_token_url
authorize_url = oauth_base_url + '/' + authorize_url
client_id, client_secret = CLIENT_DATA[service_id]
google = OAuth2Service(
client_id=client_id,
client_secret=client_secret,
name=name,
authorize_url=authorize_url,
access_token_url=access_token_url,
base_url=base_url)
access_token, access_token_secret = USER_TOKENS[user_id][service_id] # access_token_secret only needed for twitter (OAuth1)
session = google.get_session(access_token)
user = session.get('https://www.googleapis.com/oauth2/v1/userinfo').json()
print user
test_google('user1')
我已授权我的应用程序访问user1 的google 帐户,并获得了一个access_token。该访问令牌已经过期,我的程序的输出是:
{u'error': {u'code': 401, u'message': u'Invalid Credentials', u'errors': [{u'locationType': u'header', u'domain': u'global', u'message': u'Invalid Credentials', u'reason': u'authError', u'location': u'Authorization'}]}}
我想在创建会话时检查访问令牌是否已过期,不是在请求数据时。这可能吗? 如何验证会话对象是否真的被授权?
为了澄清,我想做的是以下几点:
- 首先,让用户授权我的应用程序
- 保存访问令牌以备将来使用(在数据库中,但在测试代码中,这是在脚本中硬编码的)
- 当以后的访问检测到令牌已过期时,返回步骤 1
我目前在执行第 3 步时遇到问题。我当然可以检测到对我的 GET 的 json 回复中的 401,但是强制验证所有 GET 访问看起来相当麻烦。我想要做的是在创建会话时验证会话是否真正处于活动状态,然后假设在会话对象的整个持续时间内它将保持活动状态。通常这只是几毫秒,而我的 web 应用正在处理请求并使用 OAuth 会话对象访问 google API。
【问题讨论】:
-
"我想在创建会话时检查访问令牌是否已过期,而不是在请求数据时。"这不可能。您应该使用授权用户时返回的到期时间。这意味着使用
get_raw_access_token并检查完整的响应。 -
这很奇怪(我相信你!)。但是我在创建会话时发送
access_token。我假设图书馆在内部对服务提供商(在这种情况下是谷歌)执行一些请求。并且服务提供者知道令牌已经过期。为什么在回复会话创建请求时不这么说?这是服务提供商问题还是图书馆问题?可能我误解了创建会话是什么意思,现阶段与服务提供者之间并没有真正的沟通。 -
当您调用
get_session并提供访问令牌时,没有发生网络通信;这只是使用该访问令牌创建一个新的会话对象。如果您使用get_auth_session,则会进行网络调用,但没有针对过期错误的标准格式,因此库无法自动处理。