openid connect 2.0 并在 http only cookie 中设置身份验证 JWT
openid connect 2.0 and setting authentication JWT in http only cookie
由于本地存储和会话存储都可以通过 JavaScript 访问,因此最好不要将身份验证 JWT 存储在其中任何一个中,以避免 XSS 攻击。
由于 OpenID connect 2.0 是在单独的域上执行的,我们如何设置包含经过身份验证的 JWT 的服务器端 HTTP only cookie?
我的猜测是:
- 用户访问您的网站,然后点击登录。
- 用户被重定向到第 3 方 OpenID 连接 2.0 提供商。
- 用户登录,现在被重定向到您选择的路由 www.example.com/myredirectlogin.
- 当重定向到达我的路由时,用户的浏览器会发出获取请求,并在 URI 中传入 JWT 令牌。
- 然后服务器使用提供商提供的 public 密钥通过非对称算法验证 JWT。
- 然后服务器 returns 一个以 JWT 作为值的服务器端 HTTP cookie,客户端没有任何关于 JWT 的回忆,因为它只在 URI 中并且不是'没有存储在其他地方。
我的问题是:以上是安全处理 OpenIDConnect 2.0 流程的正确流程吗?
我假设你说 "authentication JWT" 时指的是 "Id Token",因为这是 OpenID 连接所需的唯一 JWT。
OpenID connect 支持的所有流都在the spec中列出。如果您想登录到授权服务器并验证到一个单独的站点,那么您通常会使用 "authorization code" 流程,它根本不会将 ID 令牌发送到浏览器。 OpenID connect 定义了其他流程,但其中 none 提到将 ID 令牌存储在 cookie 中 - 如何在客户端(您要验证的站点)和浏览器之间维护会话是一个单独的问题从验证用户。
我在授权代码流程中找到了答案:https://connect2id.com/learn/openid-connect
步骤列表
OAuth 2.0 和 OIDC 授权代码流程
- 用户点击了您网站的登录路由
- 用户被重定向到具有正确租户 ID 的身份提供者
- 用户已通过身份验证,并在查询参数中使用访问令牌重定向到您的回调路由,即 &access_code=234234sdfkljsak。
- 使用查询参数中的访问令牌在您的 Web 服务器上的回调路由上执行了一个获取请求。
- 此回调获取路由然后应进行 post 调用以从提供者即 azure b2c 检索实际的 JWTidentity 令牌,并将访问令牌添加为请求的一部分作为查询参数或post 正文。
- 提供商 (Azure B2C) 然后将使用身份 JWT 令牌进行响应,我们会将其作为仅 HTTP 会话 cookie 发送回用户的浏览器,这样用户现在可以在所有浏览器选项卡中进行 SSO,并且 cookie 将随每个请求自动发送并免受 xss 攻击。
由于本地存储和会话存储都可以通过 JavaScript 访问,因此最好不要将身份验证 JWT 存储在其中任何一个中,以避免 XSS 攻击。
由于 OpenID connect 2.0 是在单独的域上执行的,我们如何设置包含经过身份验证的 JWT 的服务器端 HTTP only cookie?
我的猜测是:
- 用户访问您的网站,然后点击登录。
- 用户被重定向到第 3 方 OpenID 连接 2.0 提供商。
- 用户登录,现在被重定向到您选择的路由 www.example.com/myredirectlogin.
- 当重定向到达我的路由时,用户的浏览器会发出获取请求,并在 URI 中传入 JWT 令牌。
- 然后服务器使用提供商提供的 public 密钥通过非对称算法验证 JWT。
- 然后服务器 returns 一个以 JWT 作为值的服务器端 HTTP cookie,客户端没有任何关于 JWT 的回忆,因为它只在 URI 中并且不是'没有存储在其他地方。
我的问题是:以上是安全处理 OpenIDConnect 2.0 流程的正确流程吗?
我假设你说 "authentication JWT" 时指的是 "Id Token",因为这是 OpenID 连接所需的唯一 JWT。
OpenID connect 支持的所有流都在the spec中列出。如果您想登录到授权服务器并验证到一个单独的站点,那么您通常会使用 "authorization code" 流程,它根本不会将 ID 令牌发送到浏览器。 OpenID connect 定义了其他流程,但其中 none 提到将 ID 令牌存储在 cookie 中 - 如何在客户端(您要验证的站点)和浏览器之间维护会话是一个单独的问题从验证用户。
我在授权代码流程中找到了答案:https://connect2id.com/learn/openid-connect
步骤列表
OAuth 2.0 和 OIDC 授权代码流程
- 用户点击了您网站的登录路由
- 用户被重定向到具有正确租户 ID 的身份提供者
- 用户已通过身份验证,并在查询参数中使用访问令牌重定向到您的回调路由,即 &access_code=234234sdfkljsak。
- 使用查询参数中的访问令牌在您的 Web 服务器上的回调路由上执行了一个获取请求。
- 此回调获取路由然后应进行 post 调用以从提供者即 azure b2c 检索实际的 JWTidentity 令牌,并将访问令牌添加为请求的一部分作为查询参数或post 正文。
- 提供商 (Azure B2C) 然后将使用身份 JWT 令牌进行响应,我们会将其作为仅 HTTP 会话 cookie 发送回用户的浏览器,这样用户现在可以在所有浏览器选项卡中进行 SSO,并且 cookie 将随每个请求自动发送并免受 xss 攻击。