【问题标题】:Creating a Google authentication service with users stored in own database in Golang使用存储在 Golang 中自己的数据库中的用户创建 Google 身份验证服务
【发布时间】:2018-12-07 22:49:14
【问题描述】:

创建我的新反应前端应用程序套件的第一步是最好在 Go 中创建一个简单的身份验证服务器/服务,用户可以使用他们的谷歌帐户进行身份验证,这将导致:

  • 在数据库中创建一个新用户
  • 如果在db中找到匹配的用户则登录(如何确定没有密码的匹配?)

我意识到我将从 Auth 服务器/服务获得 JWT,其中包含以下常见声明:

{
    "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,
    "nonce": "0394852-3190485-2490358",
    "hd":"example.com"
}

到目前为止一切都很好,但是在那之后我不确定我需要为用户“表”存储哪些字段(使用 dgraph 数据库,但我想它是关系数据库还是图形数据库并不重要) 在电子邮件以外的数据库中,据我了解,这将是将 db 中的用户与 JWT 配对的标识符?

您如何处理与您自己的数据库的集成:

  1. 用户首次通过身份验证服务器/服务向 google 进行身份验证并在 db 中创建用户
  2. 随后用户通过相同的身份验证服务器/服务向 google 进行身份验证并登录(已经存在于 db 中 - 但如何以安全的方式验证这一点 - 其他人不能用相同的电子邮件制作虚假令牌吗? )

您是否将令牌与电子邮件一起存储在用户表中?在这种情况下,如果令牌过期/更改该怎么办?安全性如何?

所以问题不在于如何获取令牌,而在于如何将数据库中的用户与刚刚通过身份验证的 JWT 用户连接起来。

我读过的大多数教程和文章都没有详细描述数据库部分。

【问题讨论】:

  • 没有标记为关闭,因为这里有很多,但是“关于库的建议”对于 Stack Overflow 来说是特别离题的。
  • 对不起,你是对的。删了。
  • 这真的取决于你需要什么关于用户的信息。如果您需要记住权限、偏好等,请将其存储起来。否则,在您需要更多信息之前,只需发送一封电子邮件即可。
  • 之后我可以轻松地在图形数据库中查询组、角色和权限或其他任何内容,并将其放入 redux。我不喜欢在 jwt 中添加不必要的东西。这是我感兴趣的与数据库的连接。

标签: go oauth-2.0 jwt openid-connect


【解决方案1】:

在数据库中创建新用户

原则上,您只需要真正存储用户的电子邮件(以及系统内部为该用户所需的任何其他信息),以便能够将您的用户与他们用于登录的“外部”帐户“链接”。

如果在db中找到匹配的用户则登录(如何确定没有密码的匹配?)

依赖外部身份验证机制的主要原因之一是您不需要自己执行任何密码存储/验证。

您只需要将用户用于身份验证的电子邮件与您存储在数据库中的电子邮件相匹配。

其他人就不能用同一封电子邮件制作虚假令牌吗?

不,他们不能,否则这根本没有用。

令牌由身份验证服务器签名,没有身份验证服务器的私钥就无法“签名”令牌。

如何以安全的方式验证这一点

请看这里: https://developers.google.com/identity/sign-in/web/backend-auth

“验证 ID 令牌的完整性”部分讨论了如何自行或通过调用外部端点来执行此操作。

您是否将令牌与电子邮件一起存储在用户表中?

只有在除了对用户进行身份验证之外,您还计划代表用户使用 Google 的 API 时,您才需要存储用户的令牌。

在这种情况下,如果令牌过期/更改该怎么办?安全性如何?

请看这里: https://developers.google.com/identity/protocols/OAuth2

您需要同时存储一个令牌和一个刷新令牌,并且要遵循一个流程来刷新它。

关于安全性,您需要确保没有用户能够看到其他用户的令牌,因为令牌使应用程序能够代表该用户向 API 发出请求。

【讨论】:

  • 感谢您列出并回答我所有的问题 ;-)。
  • 还有一个问题。既然您说电子邮件用于在数据库中创建用户或在登录后“链接”现有用户,是否正确理解 OpenID 是不够的,因为从 OpenID 收到的 JWT 不包含电子邮件信息?我只需要一个密钥来识别数据库中的用户——然后我将(从数据库)获取我需要的用户信息到 redux 或任何状态管理解决方案中。那么剩下的是 OpenID Connect 和 OAuth2 吗?我只想要 JWT 中的最少用户信息,我需要将其与数据库中的同一用户进行匹配,那么哪个最好?
  • @Dac0d3r:此链接描述了 OpenID 的相同流程:developers.google.com/identity/protocols/OpenIDConnect,请查看“从 ID 令牌获取用户信息”部分。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-02-25
  • 2017-03-17
  • 1970-01-01
  • 1970-01-01
  • 2018-03-09
  • 1970-01-01
相关资源
最近更新 更多