openid 连接 2.0 并在仅 http cookie 中设置身份验证 JWT

Posted

技术标签:

【中文标题】openid 连接 2.0 并在仅 http cookie 中设置身份验证 JWT【英文标题】:openid connect 2.0 and setting authentication JWT in http only cookie 【发布时间】:2020-04-17 20:36:55 【问题描述】:

由于本地存储和会话存储都可以通过 javascript 访问,因此最好不要在其中任何一个中存储身份验证 JWT 以避免 XSS 攻击。

由于 OpenID 连接 2.0 是在单独的域上执行的,我们如何设置包含经过身份验证的 JWT 的服务器端 HTTP 唯一 cookie?

我的猜测是这样的:

    用户访问您的网站,然后点击登录。 用户被重定向到第 3 方 OpenID connect 2.0 提供商。 用户登录并现在被重定向到您选择的路径 www.example.com/myredirectlogin。 然后,当重定向到达我的路由并在 URI 中传递 JWT 令牌时,用户的浏览器会发出 get 请求。 然后,服务器使用提供商提供的公钥通过非对称算法验证 JWT。 然后服务器返回一个服务器端的仅 HTTP cookie,其中 JWT 作为值,客户端没有任何 JWT 的记忆,因为它只在 URI 中,没有存储在其他任何地方。

我的问题是:以上是安全处理 OpenIDConnect 2.0 流的正确过程吗?

【问题讨论】:

【参考方案1】:

当您说“身份验证 JWT”时,我假设您指的是“ID 令牌”,因为这是 OpenID 连接所需的唯一 JWT。

OpenID connect 支持的所有流都在the spec 中列出。如果您想登录到授权服务器并验证到一个单独的站点,那么您通常会使用根本不将 ID 令牌发送到浏览器的“授权码”流程。 OpenID connect 定义了其他流程,但没有一个提到将 ID 令牌存储在 cookie 中 - 如何在客户端(您正在验证的站点)和浏览器之间维护会话是与验证用户不同的问题.

【讨论】:

一旦应用服务器收到 ID 令牌(其中包含声明),它会将该令牌发送到浏览器吗?这样后续的 api calla 可以传递该 id 令牌以允许应用服务器知道谁调用了端点。 @variable 不,客户端(或应用服务器)是id_token 的受众。令牌提供有关谁向授权服务器进行身份验证以及何时进行身份验证的信息。正如我所说,客户端如何与浏览器保持会话是一个单独的问题。例如,它可以只使用不透明的会话 cookie..【参考方案2】:

我在授权码流中找到了答案:https://connect2id.com/learn/openid-connect

步骤列表

OAuth 2.0 和 OIDC 授权代码流程

    用户点击了您网站的登录路径 用户被重定向到具有正确租户 ID 的身份提供者 用户已通过身份验证,并使用查询参数中的访问令牌重定向到您的回调路由,即 &access_code=234234sdfkljsak。 在您的 Web 服务器上的回调路由上执行获取请求,并在查询参数中使用访问令牌。 然后,此回调 get 路由应进行后调用以从提供者(即 azure b2c)检索实际的 JWTidentity 令牌,并将访问令牌作为请求的一部分添加为查询参数或正文。李> 然后,提供者 (Azure B2C) 将使用身份 JWT 令牌进行响应,我们将作为仅 HTTP 会话 cookie 将其发送回用户的浏览器,这样用户现在在所有浏览器选项卡中进行 SSO,并且 cookie 将被发送自动处理每个请求,并受到 xss 的保护。

【讨论】:

以上是关于openid 连接 2.0 并在仅 http cookie 中设置身份验证 JWT的主要内容,如果未能解决你的问题,请参考以下文章

在仅支持 Spark 1.6 的集群上运行带有 Spark 2.0 的 Fat Jar

将 .NET 3.5 库与应用程序捆绑在一起,因此它可以在仅安装 .NET 2.0 的机器上运行?

如何跟踪具有访问令牌的用户是否仍具有有效会话?

使用不同的 redirect_uri 和 openid.realm 参数从 Google OpenID 2.0 迁移到 OpenID Connect

OAuth 2.0“状态”和OpenID“nonce”参数之间的区别?为啥状态不能被重用?

OpenId Connect 问题 - 授权代码流 (OAuth 2.0)