我读过有关使用 Google 处理来自 this website 的登录的信息,但它并没有很好地解释数据库应该发生的事情。
通常对于数据库中的用户帐户,您将拥有像 id
这样的字段。 , username
, password
等等。根据我在链接中读到的内容,您最终将获得用户的 ID token ,其中有一个名为“sub
”的键,其中有一个值,您可以使用它来识别用户。
我的问题是,这个“sub
”将存储在数据库中的什么位置?
它会进入id
吗? field ? Username
field ?
我认为它不应该进入 username
字段,因为有人创建的用户名可能与某人的 Google sub
完全相同ID。但是把它放在 id
中似乎也很奇怪。 field 。
此外,user accounts
中是否需要另一个字段?为了区分本地登录的用户和通过 Google 登录的用户,该表是一个 bool 值吗?
最佳答案
创建一个EXTERNAL_ID 列,并使用它来存储来自外部系统的标识符。您应该添加一个EXTERNAL_TYPE 列并将其设置为“GOOGLE”。当您要集成更多身份验证提供程序时,可以将其设置为不同的值(例如“OPEN_ID”、“FACEBOOK”。)
与外部系统交互时,始终需要存储外键/标识符,以便可靠地访问和更新外部记录。
外部 key 与本地数据库中的 ID 不同,它绝对不是用户名。它只是它自己的列,并且应该具有相当大的大小,以便可以存储遇到的任何外部 ID。
VARCHAR(64) 可能是一个好的开始,因为根据定义,我们不对标识符的类型或内容负责——这些是由外部系统提供和定义的。我们只需要保持它的值不变,在与外部系统对话时使用。
EXTERNAL_TYPE 字段可让您区分用户“本地注册”和“通过 Google 注册”或其他外部提供商。
例如:
create table "USER" (
ID int not null,
USERNAME varchar(64),
DISPLAY_NAME varchar(64),
EMAIL varchar(128),
PWD_HASH varchar(32), -- "native" password, salted & hashed for security
PWD_SALT varchar(32),
EXTERNAL_TYPE varchar(16), -- external-auth Type & ID.
EXTERNAL_ID varchar(64),
primary key (ID)
);
请注意,有些网站使用稍微高级一点的方案,用户既可以通过 Google 注册,也可以通过 native 密码登录。在这种情况下,通过一个凭据系统登录会检测到现有的电子邮件和其他凭据系统——这通常会提示用户使用其他凭据进行身份验证,链接它们并同时使用它们。这仍然基于 EXTERNAL_ID 和 EXTERNAL_TYPE 但可以将它们放在与 USER 相关的 USER_CREDENTIALS 表上,而不是 USER 表本身。
对于用户身份验证,也可以想象您可能需要一个额外的列来存储某种加密/ key / token 。不确定,只是一种可能。
关于sql - Google 登录,数据库端,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18790808/