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

是否可以从谷歌的id_token中获取个人资料信息?

孔梓
2023-03-14

使用Google的OpenIDConnect身份验证系统时,可以在<code>范围电子邮件范围,“电子邮件”和“email_verified”声明将包含在id_token,作为成功的OAuth2身份验证会话的一部分返回。

这是谷歌留档的一个例子:

ID令牌的有效负载

ID标记是包含一组名称/值对的JSON对象。下面是一个为可读性格式化的示例:

{"iss":"accounts.google.com", 
 "at_hash":"HK6E_P6Dh8Y93mRNtsDB1Q", 
 "email_verified":"true",
 "sub":"10769150350006150715113082367", 
 "azp":"1234987819200.apps.googleusercontent.com", 
 "email":"jsmith@example.com", 
 "aud":"1234987819200.apps.googleusercontent.com", 
 "iat":1353601026, 
 "exp":1353604926,
 "hd":"example.com" 
}

但是,请求配置文件范围似乎对id_token的内容没有任何影响。为了检索配置文件信息,您必须向不同的endpoint发出单独的HTTP请求(使用刚刚收到的access_token进行身份验证)以获取看起来非常相似但包含更多信息的文档:

{
  "kind": "plus#personOpenIdConnect",
  "gender": string,
  "sub": string,
  "name": string,
  "given_name": string,
  "family_name": string,
  "profile": string,
  "picture": string,
  "email": string,
  "email_verified": "true",
  "locale": string,
  "hd": string
}

理想情况下,我更希望获得id_token JWT中包含的配置文件信息(实际上是name),而不是单独调用。是否有任何方法指定其他字段并将其作为声明包含在id_token中?如果不是,为什么<code>电子邮件

共有3个答案

元昊苍
2023-03-14

嗯,这是正确的地方要求。我们正在努力支持这项功能,应该很快就会推出(在接下来的几周内)。到时候我会对这个回复做一个更新。

夏弘文
2023-03-14

当使用response_type=id_token和范围内的配置文件(如code=openid配置文件email)发出请求时,生成的id令牌应直接包含配置文件声明。

这是根据OpenID Connect规范的第5.4节,其中说“…当没有颁发访问令牌时(response_typevalueid_token就是这种情况),生成的Claims将在ID令牌中返回。”

然而,在我对他们的OAuth 2游乐场所做的一个小测试中,Google似乎没有将配置文件声明放在id令牌中,即使response_type=id_token并且没有发布访问令牌。我认为这是谷歌的一个实现缺陷,如果他们不解决这一问题(或添加对“声明”请求参数的支持),似乎就没有办法实现您所期望的。

桑飞语
2023-03-14

从今天开始,您将在令牌endpoint交换代码时获得配置文件信息(即使用“代码流”)。

如何使用:将配置文件范围添加到您的请求中,并确保您使用的是符合OpenID Connect的endpoint(https://accounts.google.com/.well-known/openid-configuration中列出的endpoint)。

在这些 ID 令牌响应中查找名称图片等声明。与之前一样,如果电子邮件范围位于请求中,则 ID 令牌将包含与电子邮件相关的声明。

当您刷新访问令牌时,与新访问令牌一起返回的ID令牌也会经常包含这些额外的声明。您可以检查这些字段,如果存在(并且与您存储的内容不同),请更新您的用户配置文件。这对于检测姓名或电子邮件地址更改很有用。

 类似资料:
  • 问题内容: 你好,我是python和django的新手,我需要一个获取当前用户配置文件的视图,我知道我应该使用User的get_profile,但我不知道如何使用它。我读了django文件,但并没有帮助我。这是我从doc中找到的: 问题答案: Django的文档说明了一切,尤其是存储有关用户的其他信息的部分。首先,您需要在字段中的某个位置定义一个模型,以获取用户的其他信息: models.py 然

  • 问题内容: 我想获取我朋友列表中的所有生日。我已经尝试了好几天。我的代码如下。 每次我使用此代码都会产生错误。令牌都显示为空,响应都显示为问题“必须使用活动访问令牌来查询有关当前用户的信息” 问题答案: 创建一个方法: 在方法主体中,您必须编写: } 上面的函数将从facebook获取json数据。您需要解析json以获得单独的配置文件数据。 来自Facebook的样本配置文件json将如下所示:

  • 个人资料        展示、管理个人的基本资料 点击编辑按钮,进入编辑模式,输入新的用户信息,点击保存,完成资料修改。

  • 问题内容: 有什么办法可以让子查询在oracle db中返回多个列?(我知道此特定的sql会导致错误,但总的来说我想要的很好) 我想要这样的结果: 我知道可以通过联接解决此问题,但这不是我要的。 我的问题很简单,是否有办法从子查询中获取两个或多个值?也许一些解决方法使用双重?这样就没有实际的联接,但是每行都有一个新的子查询? 编辑:这是一个原则性问题。我知道,您可以使用join解决所有这些问题。您

  • 我想从谷歌地图API接收道路信息,就像普通的街道信息一样。 例如,在谷歌地图应用程序中,您可以看到每条道路的交通情况。是否有任何方法可以在数据中接收此信息,而不仅仅是在屏幕上查看? 我需要得到的信息,如名称,交通,限速和起点和终点。 我考虑一些类似于现有街道信息的东西,我会给出一个位置(long,lat),系统会返回附近最近的道路(也可能是十字路口)。 有没有办法通过谷歌地图API获取这些信息?如

  • 问题是,如果用户输入Instagram的URL,如何从Instagram个人资料中读取文本。我尝试使用java.net.URL,但得到的都是大量的HTML文本。我对网页工作知之甚少,所以我在寻求一些帮助,如何从个人资料(简历,帖子标题,评论)中获取文本。 谢谢!