我正在编写一个带有spring boot的Web应用程序,并希望用户能够告诉我他的身份提供者是什么。就像我在Stackoverflow上一样。
如何以独特的方式识别用户?我已经读过我应该使用sub / Subject来区分用户。使用多个提供商时这是唯一的吗?
我担心用户会提供恶意身份提供程序,然后告诉我的应用程序他是另一个用户。
答案 0 :(得分:2)
如何以独特的方式识别用户?我已经读过我应该使用sub / Subject来区分用户。使用多个提供商时这是唯一的吗?
您将(iss
,sub
)的组合存储为全局唯一的标识符。正如Kavindu已经提到的那样,sub
声明本身只是locally unique。
我担心用户会提供恶意身份提供程序,然后告诉我的应用程序他是另一个用户。
有两种方法可以通过以下方式在您的应用中使用“多个提供商”:
如果某人的真实身份对您很重要,那么您可以选择您信任的提供商来提供某人的身份详细信息。然后,人们只能通过列表中的某个提供商登录。
但是如果它没那么重要(正常的用户名/密码注册也不提供任何保证),那么您也可以选择让人们使用他们选择的提供商登录。然后可以通过OIDC Discovery从用户的“句柄”中发现正确的提供者。
答案 1 :(得分:1)
问:如何以独特的方式识别用户?使用多个提供商时这是唯一的吗?
根据OpenID Conenct规范,“sub”声明在本地是唯一的。以下是从规范中提取,突出显示(reference),
主题标识符。 最终用户的本地唯一和从未重新分配标识
因此,当您与单个身份提供商打交道时,“sub”声明是唯一的。但这并不适用于多个提供商。
问:我担心用户会提供恶意身份提供商,然后告诉我的应用他是另一个用户。
我怀疑这种情况。您的应用程序是否允许最终用户根据需要注册不同的身份提供者?
在OpenID Connect中,有一个应用程序注册步骤。您的应用需要客户端标识符。注册过程还涉及重定向URL注册。所有这些都是在注册步骤中完成的。如果没有这些,OpenID Connect将无法运行。
除此之外,不同的提供商的行为也不同。例如,虽然“sub”是传达最终用户身份的标准声明,但提供商可以使用自定义声明来定义特定用户身份。这是OpenID Connect规范允许的。因此,您的应用程序必须仅支持您在应用程序设计时知道的已知的,完善的身份提供程序。