如何识别 Google OAuth2 用户?

2023-11-26

我使用 Facebook 登录来识别用户。当新用户到来时,我将他们的用户 ID 存储在我的数据库中。下次他们来的时候,我认出了他们的 Facebook ID,并且知道我的数据库中是哪个用户。

现在我尝试用 Google 的 OAuth2 做同样的事情,但是我怎样才能识别用户呢?

Google 向我发送了多个代码和令牌(access_token、id_token、refresh_token),但它们都不是恒定的。这意味着如果我注销并在 2 分钟后重新登录,所有 3 个值都会更改。如何唯一识别用户?

我正在使用他们的 PHP 客户端库:https://code.google.com/p/google-api-php-client/


正如其他人提到的,您可以将 GET 发送到https://www.googleapis.com/oauth2/v3/userinfo,使用您刚刚收到的 OAuth2 不记名令牌,您将收到包含有关用户的一些信息(id、名称等)的响应。

还值得一提的是,Google 实现了OpenID 连接这个用户信息端点只是其中的一部分。

OpenID 连接是 OAuth2 之上的身份验证层。交换授权时code在 Google 的令牌端点,您会获得一个访问令牌(access_token参数)以及 OpenID Connect ID 令牌(id_token范围)。

这两个令牌都是JWT(JSON 网络令牌,https://datatracker.ietf.org/doc/html/draft-ietf-oauth-json-web-token).

如果你解码它们,你会得到一些断言,包括id用户的。如果您将此 ID 链接到数据库中的用户,您可以立即识别他们,而无需执行额外的 userinfo GET(节省时间)。

正如评论中提到的,这些令牌是使用 Google 的私钥签名的,您可能需要使用 Google 的公钥来验证签名(https://www.googleapis.com/oauth2/v3/certs)以确保它们是真实的。

您可以通过将 JWT 粘贴到以下位置来查看 JWT 中的内容https://jwt.io/(向下滚动查看 JWT 调试器)。这些断言看起来像这样:

{
    "iss":"accounts.google.com",
    "id":"1625346125341653",
    "cid":"8932346534566-hoaf42fgdfgie1lm5nnl5675g7f167ovk8.apps.googleusercontent.com",
    "aud":"8932346534566-hoaf42fgdfgie1lm5nnl5675g7f167ovk8.apps.googleusercontent.com",
    "token_hash":"WQfLjdG1mDJHgJutmkjhKDCdA",
    "iat":1567923785,
    "exp":1350926995
}

还有各种编程语言的库可以以编程方式解码 JWT。

PS:要获取 Google 的 OpenID Connect 提供商支持的 URL 和功能的最新列表,您可以检查该 URL:https://accounts.google.com/.well-known/openid-configuration.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何识别 Google OAuth2 用户? 的相关文章

随机推荐

  • Kinect:如何从一些深度数据获取骨架数据(从kinect获取,但我修改了一些地方)

    我可以从 Kinect 获取深度帧 然后修改帧中的数据 现在我想使用修改后的深度帧来获取骨架数据 我该怎么做 好吧 我发现没有办法用 microsoft kinect sdks 来做到这一点 现在 我发现使用 OpenNI 是可以的 它是
  • 将多条编码多段线合并为一条编码多段线

    我正在尝试将新的编码多段线与现有多段线合并 而不对整个多段线进行解码和重新编码 新编码的折线将上传到 linux 服务器 我想将其附加到现有的折线 问题是 你不能把它们混在一起 下面是一些可以使用的示例数据 我希望在 PHP 或 shell
  • 如何访问受保护的数组值?

    您好 我有这个数组 我不确定如何从中获取名称 品牌 图像 令牌值 Gloudemans Shoppingcart CartCollection Object items protected gt Array 1264477c2182cc04
  • asp.net:无效的回发或回调参数

    我收到此错误 Server Error in Application Invalid postback or callback argument Event validation is enabled using
  • 将字符串从 __DATE__ 转换为 time_t

    我正在尝试转换从生成的字符串 DATE 宏变成time t 我不需要一个成熟的日期 时间解析器 它只处理 DATE 宏会很棒 预处理器方法会很漂亮 但函数也同样有效 如果相关的话 我正在使用 MSVC 编辑 更正后的函数应如下所示 time
  • 没有 id 的 JPA 实体

    我有一个具有以下结构的数据库 CREATE TABLE entity id SERIAL name VARCHAR 255 PRIMARY KEY id CREATE TABLE entity property entity id SERI
  • 删除给定键总和为零的行

    我有一个查询 该查询将导致在我们的 SSRS 2008 R2 服务器上创建客户账单 SQL Server实例也是2008 R2 查询很大 出于安全原因等原因我不想发布整个内容 我需要对下面的示例数据执行的操作是从结果集中删除带有 73 19
  • 如何实现点尺度的反转函数?

    我正在尝试为我的双线图表添加工具提示 但是 我没有使用 timeScale 或scaleLinear 而是使用scalePoint 来绘制图表 我试图达到以下效果 https bl ocks org mbostock 3902569 thi
  • 向 ModelAndView 添加属性

    我正在写一个HandlerInterceptor需要将某个会话范围的 bean 插入到Model postHandle的签名如下所示 public void postHandle HttpServletRequest request Htt
  • 开发在 android 中以 kiosk 模式运行的应用程序

    如何使我们的应用程序像信息亭模式应用程序一样 SureLock lockdown app 我有 LG E400 root 的 Android 手机 Android 2 3 6 我想开发像这样的应用程序Surelock我需要什么来开发这样的应
  • 记录访问器的语法默认值

    像我以前一样写下答案刚才 我遇到了一个有趣的问题 data Gender Male Female deriving Eq Show data Age Baby Child PreTeen Adult deriving Eq Show Ord
  • 在 Metro 中使用 NHibernate

    我正在将一个应用程序从 iOS 移植到 Win8 并希望在应用程序中使用 NHibernate 来存储关系数据 但是每当我添加NHibernate dll lesli Collections dll我收到以下错误 错误 2 在模块 msco
  • 有没有办法在spring4中禁用注释?

    我有一个问题 也许很简单 但我找不到解决方案 我正在使用 spring boot 并向代码添加一些注释 如下所示 EnableEurekaClient SpringBootApplication EnableCaching public c
  • 为什么析构函数比构造函数被调用更多? [复制]

    这个问题在这里已经有答案了 在以下代码中 析构函数被调用两次 而构造函数仅被调用一次 enum TFoo VAL1 VAL2 class CFoo public TFoo mf CFoo cout lt lt hi c tor1 n mf
  • 使用 android:process=":remote" 重新创建 android Application 对象

    我在我的应用程序中使用 AIDL 服务 我还想运行另一个进程 所以我使用android process remote 在清单中的服务声明中 我的问题是 当 remote进程启动它显然重新创建Application object 我真的不这样
  • 使用 jquery 获取 optgroup 中选择选项的索引

    我有以下选择
  • IntelliJ 社区版 JSP 语法高亮

    我刚刚下载了 IntelliJ 15 0 1 Community Edition 因为我厌倦了 Eclipse 而且它在我的笔记本电脑 Ubuntu 14 04 LTS 上看起来很糟糕 一切都进行得很顺利 直到我发现 JSP 文件中的语法突
  • 列表列表的所有组合[重复]

    这个问题在这里已经有答案了 我基本上是在寻找 python 版本的组合List
  • 告诉 git 永远不要更新文件

    我在 git 中有一些文件 即配置文件 我需要将它们放在 git 存储库中 但我不希望它们更新 出于某种原因 运行它们 然后更改配置文件 那么有什么方法可以告诉 git 忽略对文件的任何更改 但将原始文件保留在存储库中吗 目前 我发现执行此
  • 如何识别 Google OAuth2 用户?

    我使用 Facebook 登录来识别用户 当新用户到来时 我将他们的用户 ID 存储在我的数据库中 下次他们来的时候 我认出了他们的 Facebook ID 并且知道我的数据库中是哪个用户 现在我尝试用 Google 的 OAuth2 做同