使用 JWT 缺少授权标头

Posted

技术标签:

【中文标题】使用 JWT 缺少授权标头【英文标题】:Missing Authorization header using JWT 【发布时间】:2016-07-15 21:04:33 【问题描述】:

我正在尝试设置 JSON Web 令牌以从移动应用程序与我的 php 后端进行通信。我可以要求一个令牌就好了。当我需要验证它(或向另一个端点发出请求)时,我使用以下格式设置授权标头:

Bearer <token here>

但由于某种原因,在我的后端,$_SERVER['HTTP_AUTHORIZATION'] 没有设置。

我在本地主机上使用 Mamp Pro 和 PHP7。这是我的$_SERVER 数组的转储:

Array
(
    [SERVER_SOFTWARE] => Apache
    [REQUEST_URI] => /wp-json/jwt-auth/v1/token/validate/
    [REDIRECT_STATUS] => 200
    [HTTP_HOST] => localhost.dev
    [CONTENT_TYPE] => application/x-www-form-urlencoded
    [CONTENT_LENGTH] => 54
    [HTTP_CONNECTION] => keep-alive
    [HTTP_ACCEPT] => */*
    [HTTP_USER_AGENT] => CocoaRestClient/15 CFNetwork/760.2.6 Darwin/15.3.0 (x86_64)
    [HTTP_ACCEPT_LANGUAGE] => en-us
    [HTTP_ACCEPT_ENCODING] => gzip, deflate
    [PATH] => /usr/bin:/bin:/usr/sbin:/sbin
    [SERVER_SIGNATURE] => 
    [SERVER_NAME] => cloud.iblue.eu
    [SERVER_ADDR] => ::1
    [SERVER_PORT] => 80
    [REMOTE_ADDR] => ::1
    [DOCUMENT_ROOT] => /Applications/MAMP/htdocs/dev
    [SERVER_ADMIN] => you@example.com
    [SCRIPT_FILENAME] => /Applications/MAMP/htdocs/dev/index.php
    [REMOTE_PORT] => 51804
    [REDIRECT_URL] => /wp-json/jwt-auth/v1/token/validate/
    [GATEWAY_INTERFACE] => CGI/1.1
    [SERVER_PROTOCOL] => HTTP/1.1
    [REQUEST_METHOD] => POST
    [QUERY_STRING] => 
    [SCRIPT_NAME] => /index.php
    [PHP_SELF] => /index.php
    [REQUEST_TIME_FLOAT] => 1459177711.33
    [REQUEST_TIME] => 1459177711
    [argv] => Array
        (
        )

    [argc] => 0
)

当我尝试使用带有Basic dGVzdEB0ZXN0LmNvbToxMjM0NQ== 作为授权标头的 HTTP Basic 身份验证时,它可以正常工作:

[PHP_AUTH_USER] => test@test.com
[PHP_AUTH_PW] => 12345

知道有什么问题吗?

【问题讨论】:

我必须在我的 .htaccess 中写 RewriteCond %HTTP:Authorization .+ RewriteRule .* - [E=HTTP_AUTHORIZATION:%HTTP:Authorization] 以使 Apache 设置授权标头。你可以试试。 谢谢,我试过了(按照github.com/Tmeister/wp-api-jwt-auth 上的说明),遗憾的是它仍然无法正常工作:( 【参考方案1】:

好的,我刚刚在这里找到了答案:https://devhacksandgoodies.wordpress.com/2014/06/27/apache-pass-authorization-header-to-phps-_serverhttp_authorization/

所以我在我的 htaccess 文件中添加了以下行,它解决了我的问题:

SetEnvIf Authorization "(.*)" HTTP_AUTHORIZATION=$1

【讨论】:

这也适用于我。必须说我很茫然,为什么东西不再起作用了,而且我的标题在翻译中丢失了。【参考方案2】:

我刚遇到这个问题(同一个插件!),并通过编辑验证函数解决了它:

// in public/class-jwt-auth-plugin.php
// Check for auth in raw headers without $_SERVER variable (Apache Server).
if ( !$auth && function_exists('getallheaders') ) 
     $headers = getallheaders();
     $auth = isset($headers['Authorization'])
     ? $headers['Authorization'] : false;

虽然我不是 PHP 专家,但我不明白为什么不能将这段代码包含在插件中。

【讨论】:

【参考方案3】:

如果您使用 Mamp PRO,我发现您可以在他们的配置编辑器中添加行:

【讨论】:

以上是关于使用 JWT 缺少授权标头的主要内容,如果未能解决你的问题,请参考以下文章

Flask Restful NoAuthorizationError 缺少授权标头

CORS:响应中缺少授权标头(jQuery / Spring)

Angular2 Spring Boot JWT 缺少响应标头

缺少 Django、React 和 Rest Framework JWT 身份验证标头

为啥缺少授权标头?

使用 WCF 的 Http 请求中缺少授权标头