我有一个站点有望使用第三方服务登录(通过使用OAuth2和OIDC)。我了解其中90%的过程,但未能达到我认为的最后一步。我将在此处介绍这些步骤,可能有人会帮助我填补这些空白。在我的设置中,资源服务器和授权服务器是同一台机器。
这是我所设想的登录过程。
因此,用户已通过身份验证,我们知道他们的主张,但是,在上述情况下我没有得到的是网站A如何知道我(最终用户)的身份。
我从未登录站点A,因此大概没有设置cookie。基本上,我去过该站点,已重定向到另一个站点,在那里登录,然后被重定向回站点A,但是在最后一个重定向中是否设置了cookie以标识我?
我已经在网上阅读了大量有关此内容的信息,但没有找到明确的答案。
此外,我是否认为在访问授权码流中访问令牌永远不会到达用户而是驻留在应用程序服务器上,这是正确的吗?
答案 0 :(得分:1)
OpenID Connect身份验证服务器提供userinfo endpoint,站点A可以使用该Request
获取有关授权访问令牌(或授权代码)的用户的信息。为了使身份验证提供程序(站点B)能够执行此操作,它需要保持令牌与其用户之间的关联。因此,没有用于此目的的cookie。
您对验证码流程是正确的-访问令牌位于后端-无需将其发送给前端/用户。
要使保留在SiteA后端的令牌与浏览器的后续请求配对,您有几种选择:
答案 1 :(得分:1)
如果您really
想知道该用户在SiteA上,则该用户必须是SiteA自己的用户数据库中的用户。如果SiteA不仅是SiteB API的代理,而且拥有自己的用户,权限和功能,那么这是有道理的。
要弄清楚用户在SiteA上的身份,您需要将所有SiteA的用户与Auth Server的用户进行匹配。
第1部分。将现有用户导入Auth Server
如果您控制Auth Server,请将所有当前用户导入其用户数据库。他们每个人都有主题ID(身份验证服务器端的ID)。将这些ID复制回SiteA的db中的相应用户:SiteA的User表将具有新列,例如:
userid,user_name,user_last_name,user_auth_id
(新列)
如果您不能导入所有用户,则会变得很复杂。我能想到的唯一方法是:您必须两次登录这些用户-一次登录OIDC提供程序,一次登录SiteA,然后将SiteA的用户与OIDC用户关联。
第2部分。将传入用户与SiteA中的内部用户进行匹配
在OIDC服务器的成功响应中,您将获得ID令牌。它包含具有用户主题ID的sub
个声明。完成后,您将需要在内部数据库中进行查找并找到相应的SiteA用户。如果找不到,请在SiteA创建一个新用户(如果所有现有用户均已导入)
一旦您知道用户是谁,就可以像平常一样将其登录到SiteA(例如,给他们一个cookie)。