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

时间:2018-06-28 19:17:03

标签: 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"
}

到目前为止,还不错,但是在那之后,我不确定是否需要为用户“表”存储哪些字段(使用dgraph db,但是我想它是关系数据库还是图数据库都没关系),而不是电子邮件中的数据库,据我理解,这是将db中的用户与JWT配对的标识符吗?

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

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

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

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

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

1 个答案:

答案 0 :(得分:1)

在数据库中创建新用户

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

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

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

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

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

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

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

如何以安全方式进行验证

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

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

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

您仅需要存储用户的令牌,除非除了对他们进行身份验证之外,您还打算代表用户使用Google的API。

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

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

您将需要同时存储令牌和刷新令牌,并且需要遵循以下流程来刷新令牌。

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