当前位置: 首页 > 知识库问答 >
问题:

为Google OAuth2 WebServerFlow保存用户名

卫深
2023-03-14

我已经在Python中实现了Google的OAuth2过程(有关使用OAuth2WebServerFlow:https://developers.google.com/api-client-library/python/guide/aaa_oauth的教程,请参阅此链接),但无法弄清楚如何捕获我的身份验证用户是谁。例如,他们的电子邮件地址是什么?否则,当我保存他们的OAuth2凭据时,我不知道凭据属于谁。auth_uri、流或凭据对象中的任何内容都没有提供身份验证用户的电子邮件地址。我代码中倒数第二行打印出一个JSON,其中包含OAuth2凭据类的密钥(http://google-api-python-client.googlecode.com/hg/docs/epy/oauth2client.client.OAuth2Credentials-class.html

有什么想法吗?我无法想象我必须直接向认证用户询问他们的帐户信息。。。

我正在使用新的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('/')

共有1个答案

谢哲瀚
2023-03-14

解决方案在您请求的范围内。我定义了一个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.email和userinfo.email内容,其中包括我需要的所有内容。请注意,范围参数是一个空格分隔的字符串。它实际上非常优雅!

 类似资料:
  • 我通过Symfony2 crud生成器创建了一个表单。我有一个与当前实体不相关的用户,我想让它自动保存当前用户的createdby字段作为它的值。你是怎么做到的?我试过了

  • 问题内容: 我正在尝试制作一个程序,它将询问用户名,然后提出一系列问题。每次问题正确时都加一个点。我正在尝试使其将分数和用户名一起存储到文本文件中,以便在文本文件中看起来像这样: 因此,以约翰为例,如果他要获得4分,它将在文本文件中写为: 但是我想要这样,如果约翰要再次参加考试而不是两次让约翰参加: 我希望它读为: 与其重写名称和分数,不如写出tab,然后将分数与名称为John in的那一行写在同

  • 在我的应用程序中,我试图执行一个简单的登录/注册操作。 我有一个,如果没有用户,它返回一个登录屏幕,如果有用户登录,它返回一个主屏幕: 代码工作得很好,如下所示: 我怎样才能解决这个问题?

  • 我有一个混合用户群的Keycloak领域。有些用户是原生的(本机用户),有些是通过自定义用户存储SPI实现提供的(联邦用户)。 当我执行OIDC登录时,Keycloak要求批准4个作用域(测试客户机、配置文件、电子邮件、角色)。该请求是用openID作用域执行的。Keycloak将其转换为这四个作用域。test-client是客户端名称。在管理UI中没有显示具有此名称的实际客户端范围。 使用本机用

  • 明文保存 明文hash后保存,如md5 MD5+Salt方式,这个salt可以随机 知乎使用了Bcrypy(好像)加密

  • 我正在使用node.sdk、stormpath、express.js和passport.js为我的新网站制作一个用户帐户系统。所以我设置了一个自定义数据槽的帐户。我想知道,当他们注销时,我如何将新数据发布到这个自定义数据槽中,并在他们登录时检索它。我对使用node是新手,我不知道在他们登录时,我的代码应该放在哪里,也不知道如何访问“用户”帐户信息。据我所知,Passport.js正在处理身份验证,