【问题标题】:Uniquely identifying a user during the OAuth2 process在 OAuth2 过程中唯一标识用户
【发布时间】:2020-09-27 14:52:46
【问题描述】:

我制作了一个烧瓶/python 网站,可以在用户的​​谷歌日历上创建和编辑事件。显然,用户必须通过 OAuth2 给予他们的许可(我很难理解,但最终还是成功了)。目前,我正在强制用户注册并登录到我的网站,并且我存储了各种用户设置和附加到他们在我的网站注册时选择的任何用户名的刷新令牌......但现在我希望用户能够允许用户无需注册即可使用我的网站。我仍然想存储用户设置和刷新令牌,但现在我需要某种标签来识别用户,这样当他们回来时我知道是他们(也许他们会从另一台 PC 访问我的网站)。是否有一些字符串可以作为 OAuth2 过程的一部分访问,用于唯一标识用户,或者我是否需要执行一些额外的步骤来获取这样的字符串...

编辑:查看 shox 的评论并查看对this SO question 的最受好评的答案,似乎在 oauth 过程结束时我应该...

发送一个 GET 到 https://www.googleapis.com/oauth2/v3/userinfo,使用 您刚刚收到的 OAuth2 不记名令牌,您将收到回复 包含有关用户的一些信息(id、姓名等)。

不幸的是,我不太确定这意味着什么,也不知道如何在 python 中对其进行编码。我的最佳猜测如下:

r = requests.get( "https://www.googleapis.com/oauth2/v3/userinfo",
                   params = {'token': credentials.token } )

data = r.json()

但数据原来是{'error': 'invalid_request', 'error_description': 'Invalid Credentials'}

已解决: ...似乎我需要使用字符串“access_token”而不是“token”,现在数据包含电子邮件地址和其他一些零碎的东西。

r = requests.get( "https://www.googleapis.com/oauth2/v3/userinfo",
                   params = {'access_token': credentials.token } )

data = r.json()

【问题讨论】:

标签: python flask oauth-2.0 google-calendar-api


【解决方案1】:

通过 OAuth 2.0 唯一标识 Google 用户的一种方法是记录用户的唯一标识符。该标识符称为Source 对象的id 属性。

要读取该标识符,您需要调用People.get(),将people/me 作为resourceName,将metadata 作为personFields。第一个值将授权帐户标识为我们感兴趣的帐户。在第二个参数personFields 中,我们表示我们需要有关目标帐户的元数据。后者本身不需要,但因为我们需要在personFields 中填写一个有效值。总之,请求应该如下所示(如果使用cURL 完成):

curl \
  'https://people.googleapis.com/v1/people/me?personFields=metadata&key={API KEY}' \
  --header 'Authorization: Bearer {ACCESS TOKEN}' \
  --header 'Accept: application/json' \
  --compressed`

通过该请求,您将收到一个 JSON 响应,第一行将显示:

{
  "resourceName": "people/{ID HERE}",
  …

这将是您要用于用户识别的id。如果您需要更多帮助,请随时问我。

【讨论】:

  • 一目了然,如果您已寻求访问用户“联系人”的权限,则可以访问“人员 API”。我没有请求这样的许可,所以我怀疑这行不通。我只是寻求访问用户日历的权​​限。
  • 你好@Mick!请更新您的范围并测试该解决方案是否适合您。回来把你的发现告诉我,我可以继续帮助你。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-03-22
  • 1970-01-01
  • 1970-01-01
  • 2014-02-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多