使用存储在 Golang 自己的数据库中的用户创建 Google 身份验证服务

Dac*_*d3r 5 go oauth-2.0 jwt openid-connect

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

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

我意识到我将从 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"
}
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

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

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

eug*_*ioy 6

在数据库中创建一个新用户

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

如果在数据库中找到匹配的用户,则登录(如何在没有密码的情况下确定匹配?)

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

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

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

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

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

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

请参阅此处: https ://developers.google.com/identity/sign-in/web/backend-auth

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

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

如果除了验证用户身份之外您还计划代表用户使用 Google 的 API,则只需存储用户的令牌即可。

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

请参阅此处: https://developers.google.com/identity/protocols/OAuth2

您将需要存储令牌和刷新令牌,并且需要遵循一个流程才能刷新它。

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