我已经在Python中实现了Google的OAuth2过程(参见此链接获取关于使用OAuth2WebServerFlow的教程:https://developers.google.com/api-client-library/python/guide/aaa_oauth),但无法确定如何捕获我的身份验证用户是谁。例如,他们的电子邮件地址是什么?否则,当我保存他们的OAuth2凭据时,我不知道凭据属于谁。auth_uri、flow或凭据对象中没有任何内容提供身份验证用户的电子邮件地址。我的代码中的倒数第二行打印出带有OAuth2Credentials类(http://google-api-python-client.googlecode.com/hg/docs/epy/oauth2client.client.OAuth2Credentials-class.html)密钥的JSON
任何想法?我无法想象我必须直接向身份验证用户询问他们的帐户信息…
我正在使用新的GMail API构建一个应用程序,需要离线访问用户的帐户。
class Auth(app.basic.BaseHandler):
def get(self):
flow = OAuth2WebServerFlow(client_id=settings.get('google_client_id'),
client_secret=settings.get('google_client_secret'),
scope=OAUTH_SCOPE,
redirect_uri='http://localhost:8001/auth/google/return')
auth_uri = flow.step1_get_authorize_url()
return self.redirect(auth_uri)
class AuthReturn(app.basic.BaseHandler):
def get(self):
oauth_code = self.get_argument('code', '')
flow = OAuth2WebServerFlow(client_id=settings.get('google_client_id'),
client_secret=settings.get('google_client_secret'),
scope=OAUTH_SCOPE,
redirect_uri='http://localhost:8001/auth/google/return')
credentials = flow.step2_exchange(oauth_code)
# Save credentials to database. How do I get the username?
print credentials.to_json()
return self.redirect('/')
解决方案在您请求的范围内。我定义了一个OAUTH_SCOPE变量
OAUTH_SCOPE = 'https://www.googleapis.com/auth/gmail.modify'
但是这个作用域只给你GMail API定义的信息,不包括用户配置信息。因此,要扩展凭据所提供的内容,必须扩展身份验证请求的范围:
OAUTH_SCOPE = ('https://www.googleapis.com/auth/gmail.modify '
'https://www.googleapis.com/auth/userinfo.email '
'https://www.googleapis.com/auth/userinfo.profile')
使用这个作用域变量运行完全相同的代码将使您能够访问userinfo。电子邮件和用户信息。给我发邮件,包括我需要的所有东西。注意,scope参数是一个空格分隔的字符串。它实际上非常优雅!