Oauth 2.0 为OAuth2/OIDC授权代码流使用第三方站点-了解最后的步骤
我有一个网站希望使用第三方服务登录(通过使用OAuth2和OIDC)。我了解90%的过程,但我没有得到我认为是最后一步。我将描述我在这里看到的步骤,也许有人可以帮我填补这些空白。在我的设置中,资源服务器和授权服务器是同一台机器 这是我设想的登录过程Oauth 2.0 为OAuth2/OIDC授权代码流使用第三方站点-了解最后的步骤,oauth-2.0,openid-connect,Oauth 2.0,Openid Connect,我有一个网站希望使用第三方服务登录(通过使用OAuth2和OIDC)。我了解90%的过程,但我没有得到我认为是最后一步。我将描述我在这里看到的步骤,也许有人可以帮我填补这些空白。在我的设置中,资源服务器和授权服务器是同一台机器 这是我设想的登录过程 用户来到我的站点(我们称之为站点A)并单击登录 它们被重定向到它们所在的身份验证站点(站点B) 输入他们的用户名/密码 假设凭据正确,则会使用身份验证代码将它们重定向回站点A 站点A使用此身份验证代码,并在后台通道中与站点B通信 再次请求将代码交换为
此外,我认为在授权代码流中,访问令牌永远不会到达用户,而是驻留在应用程序服务器上,这是正确的吗?OpenID Connect auth server提供了,哪个站点A可以用于获取授权访问令牌(或授权代码)的用户的信息。为了使身份验证提供者(站点B)能够做到这一点,它需要保持令牌与其用户之间的关联。因此,没有饼干用于此目的 关于身份验证代码流,您是正确的-访问令牌保留在后端-无需将其发送给前端/用户 为了能够将SiteA后端保留的令牌与来自浏览器的后续请求配对,您有几个选项:
- 您可以将后端会话与cookie一起使用,这非常简单,因为大多数后端框架都内置了对它的支持。cookie随每个请求自动发送,令牌可以存储在会话对象中。如果您需要集群,此解决方案可能更难扩展
- 您可以创建自己的会话实现—可以使用cookie,也可以使用RESTAPI上预期的某个标识符作为授权HTTP头值。后端会话数据可以保存在一些分布式存储中,如Hazelcast或数据库。会话标识符可以是签名JWT的形式,因此您可以将用户信息保存在其中
- 您可以将后端会话与cookie一起使用,这非常简单,因为大多数后端框架都内置了对它的支持。cookie随每个请求自动发送,令牌可以存储在会话对象中。如果您需要集群,此解决方案可能更难扩展
- 您可以创建自己的会话实现—可以使用cookie,也可以使用RESTAPI上预期的某个标识符作为授权HTTP头值。后端会话数据可以保存在一些分布式存储中,如Hazelcast或数据库。会话标识符可以是签名JWT的形式,因此您可以将用户信息保存在其中
真的想知道SiteA上的用户是谁,则必须是SiteA自己的用户数据库中的用户。如果SiteA不仅仅是SiteB API的代理,而且拥有自己的用户、权限和功能,那么这是有意义的
要确定SiteA上的用户是谁,您需要将SiteA的所有用户与Auth Server的用户进行匹配
第一部分。将现有用户导入Auth Server
如果控制Auth Server,请将所有当前用户导入其用户数据库。它们中的每一个都有主题ID(身份验证服务器端的ID)。将这些ID复制回SiteA数据库中的相应用户:SiteA的用户表将有新列,例如:
userid、user\u name、user\u last\u name、user\u auth\u id
(新列)
如果您不能导入所有用户,则会变得复杂。我能想到的唯一方法是:您必须将这些用户登录两次——一次登录到OIDC provider,一次登录到SiteA,然后将SiteA的用户与OIDC用户关联
第二部分。将传入用户与SiteA中的内部用户相匹配
在OIDC服务器的成功响应中,您将获得ID令牌。它包含带有用户主体ID的sub
声明。当你有了这些,你将需要在你的内部数据库中做一个查找,并找到相应的SiteA的用户。如果未找到新用户,请在SiteA创建新用户(如果已导入所有现有用户)
一旦您知道用户是谁,请像平常一样将他们登录到SiteA(例如给他们一个cookie)。如果您想知道SiteA上的用户是谁,则必须是SiteA自己的用户数据库中的用户。如果是的话,这是有道理的