如何在 Slim 3 响应标头中附加 JWT 令牌

Posted

技术标签:

【中文标题】如何在 Slim 3 响应标头中附加 JWT 令牌【英文标题】:How to attach JWT token in Slim 3 Response Header 【发布时间】:2019-03-27 18:12:31 【问题描述】:

我目前正在从事 SSO 项目。与 Google 一样,我们将 accounts.domain.com 作为 SSO 服务器。我们在三个不同的服务器(application1.com、application2.com、application3.com)上托管了三个应用程序。

只要用户想从这三个应用程序登录,用户就会被重定向到 SSO 服务器。如果用户提供的登录凭据正确,则意味着 SSO 服务器会生成 JWT 访问令牌。现在必须将生成的令牌附加到用户请求的应用程序响应标头,然后用户将被重定向到请求的应用程序以及“授权:承载 $token”。

我目前在将生成的令牌附加到响应标头时遇到问题。我目前正在使用 Slim 3 框架以及 lcobucci/jwt 作为 JWT 令牌。

我的代码:

$username = "Test";
$newResponse = $response->withHeader('Authorization' , "Bearer $token");
return $newResponse->withRedirect("http://application1.com/$username", 301); 

当我在 accounts.domain.com 中调试 Response 标头时,似乎设置了 Authorization 标头。但在另一端(application1.com)没有收到授权标头。

截图

Initial Request from application1.com SSO Domain Redirect to grab the Cookie Validate the Session by the Grabbed Cookie and attach the Auth Header attached Authentication Success but no Authorization Headers Received

我的疑问是问题是否是由于 .htaccess 文件中的服务器配置(apache2)(或)我的实现本身是错误的。

指导我修复此错误。

环境详情:

服务器:Apache 2 框架:Slim 3 JWT:lcobucci/jwt 包

【问题讨论】:

【参考方案1】:

HTTP 协议中的重定向不支持将任何标头添加到目标位置。它本身基本上只是一个标题,只允许一个 URL。

看起来像这样:

HTTP/1.1 307 Temporary Redirect
Location: http://application1.com

当您添加授权标头时,您只是将该标头发送回客户端:

HTTP/1.1 307 Temporary Redirect
Location: http://application1.com
Authorization: ...

当您发送响应重定向并设置一些标头(如Authorization)时,浏览器不会将此标头转发到它现在重定向到的站点。如果您一心想将某些参数传递给浏览器将重定向到的站点,则必须将该参数作为 URL 查询参数传递。

【讨论】:

是否有可能使用 js 捕获该 Auth 标头并将其附加到 application1.com 重定向。 除了 HTTP cookie,协议规范中没有关于转发标头的任何内容。客户端需要实现这个功能。

以上是关于如何在 Slim 3 响应标头中附加 JWT 令牌的主要内容,如果未能解决你的问题,请参考以下文章

如何从角度 6 中的“响应标头”获取 JWT 令牌

如何使用 express 在用户浏览器的响应标头 cookie 中查找 JSON Web 令牌 (JWT) 来制作 node.js?

如何在客户端上保存 JWT 令牌,在节点中使用 Hapi js。?

响应标头中缺少 jwt 授权令牌

JSON Web 令牌 (JWT):我应该使用响应标头还是正文进行令牌传输?

未从响应标头中的后端获取 JWT 令牌