如果使用了授权承载令牌,则为 400 错误请求
Posted
技术标签:
【中文标题】如果使用了授权承载令牌,则为 400 错误请求【英文标题】:400 Bad Request if Authorization Bearer token used 【发布时间】:2016-02-05 17:21:02 【问题描述】:我正在使用 PostMan 解决我的 Angular / NodeJS 应用程序出现的奇怪的 400 错误。
我正在尝试 GET https://example.com/login.html
并且请求有两个标头:
Authorization: Bearer eyJ0eXAiOiJKV1QiLCJhbGc...==
和 Accept: text/html
这会返回一个400 Bad Request
错误(服务器:cloudflare-nginx)
这很好用(返回200
)如果:
我在 http://localhost:5000/login.html
的本地环境中访问该文件(没有 https 因素?)-或-
我从标题中删除了Authorization: Bearer
如果我查看我的 NodeJS 服务器日志,我什至看不到请求通过。所以/login.html
甚至没有受到打击,我猜是因为 Express 在我的 app.use(logger('dev'));
接听之前拒绝了它。
更新:我相信 Cloudflare 会在请求到达 Heroku 之前将其退回 400。
还有几点:
我正在使用 JWT 对用户进行身份验证,这就是 Bearer 令牌的来源。
如果我使用 Bearer 令牌访问其他端点,例如 /profile
,它会通过解码令牌正确响应用户配置文件。
我的问题是:
为什么这个请求在其他端点上工作时会是“错误请求”?
有没有办法在请求返回 400 之前捕捉到这一点并对其进行处理?
【问题讨论】:
【参考方案1】:事实证明,这个问题与我的 JWT 实现有关。出于某种原因,一个用户继续收到导致这 400 错误的令牌,即使该令牌已使用 JWT.io 验证为有效。
我做了两个重要的更改来解决这个问题:
我在令牌负载中嵌入了完整的用户配置文件(长 JSON)。出于性能原因(小得多)和以防万一复杂负载中的某些东西导致问题,我将其缩减为仅他们的用户 ID。
我在节点实现中从 JWT-Simple 切换到 jsonwebtoken
。
我很高兴这有效。我的下一步是从“授权”切换到“x-encoded-auth”或其他一些自定义名称。
【讨论】:
cloudflare 提供的关于此的任何文档? 我认为我遇到了一些破坏身份验证的 SSL 问题。当我在没有 SSL 的情况下访问时,它正在工作 - 所以希望用户配置文件的大小不是问题 @Simon_Weaver 您是否尝试过切换到 JWT-Simple? 这个周末已经花了足够的时间搞清楚身份服务器并刷新令牌和 angular2。希望我现在能找出问题所在,它似乎与 SSL 相关 原来有同事看到过这个问题。这是他们关于如何解决的建议:“默认情况下,Node express 对请求有效负载大小有一定限制,并且在您的情况下超出某些用户的这些限制并导致问题。您可以在 node express API 中覆盖这些默认限制,如下所示:this.express.use(bodyParser.json( limit: ‘50mb’ ));
this.express.use(bodyParser.urlencoded( limit: ‘50mb’, extended: true, parameterLimit: 50000 ));
"【参考方案2】:
@James,我没有足够的声誉来对您的答案发表评论,但我认为这对其他在这个问题上苦苦挣扎的人会有所帮助,说明您的建议确实减少了签名用户的复杂性/大小导致解决了我遇到的类似问题。无论如何,这在我的性能优化列表中 - 但我没有想到这可能是在这种情况下导致错误的原因 - 所以你值得称赞......谢谢!
对于读者 - 在这个 SO 线程中有一些关于令牌最大大小的有用链接:What is the maximum size of JWT token?
这是我用来检查生成令牌有效性的工具...https://www.base64decode.org/
希望这可以证明从评论到回答的升级是合理的!
【讨论】:
以上是关于如果使用了授权承载令牌,则为 400 错误请求的主要内容,如果未能解决你的问题,请参考以下文章