Oauth 2.0 为OAuth2/OIDC授权代码流使用第三方站点-了解最后的步骤

Oauth 2.0 为OAuth2/OIDC授权代码流使用第三方站点-了解最后的步骤,oauth-2.0,openid-connect,Oauth 2.0,Openid Connect,我有一个网站希望使用第三方服务登录(通过使用OAuth2和OIDC)。我了解90%的过程,但我没有得到我认为是最后一步。我将描述我在这里看到的步骤,也许有人可以帮我填补这些空白。在我的设置中,资源服务器和授权服务器是同一台机器 这是我设想的登录过程 用户来到我的站点(我们称之为站点A)并单击登录 它们被重定向到它们所在的身份验证站点(站点B) 输入他们的用户名/密码 假设凭据正确,则会使用身份验证代码将它们重定向回站点A 站点A使用此身份验证代码,并在后台通道中与站点B通信 再次请求将代码交换为

我有一个网站希望使用第三方服务登录(通过使用OAuth2和OIDC)。我了解90%的过程,但我没有得到我认为是最后一步。我将描述我在这里看到的步骤,也许有人可以帮我填补这些空白。在我的设置中,资源服务器和授权服务器是同一台机器

这是我设想的登录过程

  • 用户来到我的站点(我们称之为站点A)并单击登录
  • 它们被重定向到它们所在的身份验证站点(站点B) 输入他们的用户名/密码
  • 假设凭据正确,则会使用身份验证代码将它们重定向回站点A
  • 站点A使用此身份验证代码,并在后台通道中与站点B通信 再次请求将代码交换为令牌
  • 站点B向站点A(而不是最终用户或服务器)提供访问令牌
  • 站点A然后再次与站点B通信(资源和身份验证服务器在此场景中相同),并获取相关的用户详细信息
  • 因此,用户是经过身份验证的,我们知道他们有什么声明,但是,在上述场景中,我没有得到的是站点A如何知道我(最终用户)是谁

    我从未登录过网站,所以可能没有设置cookie。基本上,我已经去了这个站点,被重定向到另一个站点,在那里登录,然后被重定向回站点A,但是在最后一次重定向中是否设置了cookie来识别我

    我在网上读了很多关于这方面的文章,但没有找到一个明确的答案


    此外,我认为在授权代码流中,访问令牌永远不会到达用户,而是驻留在应用程序服务器上,这是正确的吗?

    OpenID Connect auth server提供了,哪个站点A可以用于获取授权访问令牌(或授权代码)的用户的信息。为了使身份验证提供者(站点B)能够做到这一点,它需要保持令牌与其用户之间的关联。因此,没有饼干用于此目的

    关于身份验证代码流,您是正确的-访问令牌保留在后端-无需将其发送给前端/用户

    为了能够将SiteA后端保留的令牌与来自浏览器的后续请求配对,您有几个选项:

    • 您可以将后端会话与cookie一起使用,这非常简单,因为大多数后端框架都内置了对它的支持。cookie随每个请求自动发送,令牌可以存储在会话对象中。如果您需要集群,此解决方案可能更难扩展
    • 您可以创建自己的会话实现—可以使用cookie,也可以使用RESTAPI上预期的某个标识符作为授权HTTP头值。后端会话数据可以保存在一些分布式存储中,如Hazelcast或数据库。会话标识符可以是签名JWT的形式,因此您可以将用户信息保存在其中

    OpenID Connect auth服务器提供,该站点可用于获取授权访问令牌(或授权代码)的用户的信息。为了使身份验证提供者(站点B)能够做到这一点,它需要保持令牌与其用户之间的关联。因此,没有饼干用于此目的

    关于身份验证代码流,您是正确的-访问令牌保留在后端-无需将其发送给前端/用户

    为了能够将SiteA后端保留的令牌与来自浏览器的后续请求配对,您有几个选项:

    • 您可以将后端会话与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自己的用户数据库中的用户。如果是的话,这是有道理的