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

标签 go oauth-2.0 jwt openid-connect

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

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

我意识到我将从 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 数据库,但我想它是关系数据库还是图形数据库并不重要) 在除电子邮件以外的数据库中,据我了解,这将是将数据库中的用户与 JWT 配对的标识符?

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

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

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

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

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

最佳答案

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

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

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

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

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

其他人不能用同一封电子邮件制作一个假 token 吗?

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

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

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

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

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

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

如果除了对用户进行身份验证之外,您还计划代表用户使用 Google 的 API,那么您只需要存储用户的 token 。

在那种情况下,如果 token 过期/更改怎么办,安全性如何?

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

您将需要存储 token 和刷新 token ,并且要遵循一个流程来刷新它。

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

关于go - 使用存储在 Golang 自己的数据库中的用户创建 Google 身份验证服务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51089911/

相关文章:

c - 您如何构建Pion mediadevices webrtc示例?

go - Go 编译文件如何在不同的操作系统或 CPU 架构上工作?

Spring Security 5 OAuth2 客户端密码授予类型

postgresql - 使用黑名单撤销 JWT session token 。我应该为性能黑名单创建另一个系统吗?

node.js - 基本身份验证和 JWT

pointers - 如何在 Golang 中动态取消引用指针

java - Facebook OAuth 异常 : redirect_uri missing

azure - 使用个人 Microsoft 帐户登录 Oauth2 v2 失败

azure - 将数据从 Azure Function Filter 传递到 Function

python - Golang : Get request sends me html contents but works fine from python and curl