JWT仅在实时站点上无法从请求中解析令牌

时间:2019-05-14 12:04:47

标签: php laravel .htaccess jwt apache2

我已经使用PHP(版本7.0)构建了一个自定义API,特别是使用tymon / jwt-auth(版本1.0.0-rc.2)包进行用户授权的Laravel框架(版本5.5.40)。我的许多控制器功能都使用此行来获取当前用户的凭据:

$user = JWTAuth::parseToken()->authenticate();

我使用Postman测试我的api。

当我在本地环境中进行api调用时,授权会正常通过并返回预期的数据。 当我对实时站点API(托管在我的apache服务器中)进行api调用时,出现此错误:

无法从请求中解析令牌

由于此错误仅发生在我的实时API上,因此我推测我的API的.htaccess文件存在问题(通过应用程序通常可以识别的方式,我进行了一些调试并检查了我的apache error_log以确保我的API的.htaccess的更改会被识别)。 我尝试添加这些行(以及在研究过程中遇到多个建议时这些行的不同变体):

RewriteEngine On
RewriteCond %{HTTP:Authorization} .+
RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]

,但错误仍然存​​在。 我尝试添加以下代码:

var_dump($_SERVER);

之前:

$user = JWTAuth::parseToken()->authenticate();

,我注意到在我的实时API上,$ _ SERVER数组中缺少这些元素: REDIRECT_HTTP_AUTHORIZATION,HTTP_AUTHORIZATION

上面的.htaccess代码不是要手动添加这些代码吗?

这些是我在Chrome DevTools中看到的响应标题:

访问控制允许来源:http:/example.gr

缓存控制:无缓存,私有的

连接:关闭

内容编码: gzip

内容类型: application / json

日期:星期二,格林尼治标准时间2019年5月14日11:33:10

服务器: Apache

传输编码:分块

不同:起源,接受编码

X-RateLimit-Limit: 60

X-RateLimit-剩余: 59

这些是我的请求标头(显示了临时标头):

接受:应用程序/ json,文本/纯文本, /

授权:承载eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJodHRwOlwvXC9hcGkudjIucmVzY2FwZXIuaG9uZXN0cGFydG5lcnMuZ3JcL2FwaVwvYXV0aFwvbG9naW4iLCJpYXQiOjE1NTc4MzM1ODksImV4cCI6MTY0NDIzMzU4OSwibmJmIjoxNTU3ODMzNTg5LCJqdGkiOiJweDRjNDlOckFQbGMyM21OIiwic3ViIjo1LCJwcnYiOiI4N2UwYWYxZWY5ZmQxNTgxMmZkZWM5NzE1M2ExNGUwYjA0NzU0NmFhIn0.YWPhPDeNrB4TI1gdhBYylrmIAs1-R1-K2M2eKyO89KY

来源: http://example.gr

推荐人: http://example/summary

用户代理: Mozilla / 5.0(Windows NT 10.0; Win64; x64)AppleWebKit / 537.36(KHTML,例如Gecko)Chrome / 74.0.3729.131 Safari / 537.36

编辑: 这是在httpd.conf文件中找到的针对该特定域的生产服务器的虚拟主机配置:

<VirtualHost |example-ip|:80>
  ServerName api.example.gr
    ServerAlias www.api.example.gr
  DocumentRoot /home/example/public_html/api/public
  ServerAdmin webmaster@api.example.gr
  UseCanonicalName Off

  ## User example # Needed for Cpanel::ApacheConf
  <IfModule userdir_module>
    <IfModule !mpm_itk.c>
      <IfModule !ruid2_module>
        <IfModule !mod_passenger.c>
          UserDir enabled example
        </IfModule>
      </IfModule>
    </IfModule>
  </IfModule>

  # Enable backwards compatible Server Side Include expression parser for Apache versions >= 2.4.
  # To selectively use the newer Apache 2.4 expression parser, disable SSILegacyExprParser in
  # the user's .htaccess file.  For more information, please read:
  #    http://httpd.apache.org/docs/2.4/mod/mod_include.html#ssilegacyexprparser
  <IfModule include_module>
    <Directory "/home/example/public_html/api/public">
      SSILegacyExprParser On
    </Directory>
  </IfModule>



  <IfModule suphp_module>
    suPHP_UserGroup example example
  </IfModule>
  <IfModule suexec_module>
    <IfModule !mod_ruid2.c>
      SuexecUserGroup example example
    </IfModule>
  </IfModule>
  <IfModule ruid2_module>
    RMode config
    RUidGid example example
  </IfModule>
  <IfModule mpm_itk.c>
    # For more information on MPM ITK, please read:
    #   http://mpm-itk.sesse.net/
    AssignUserID example example
  </IfModule>
  <IfModule mod_passenger.c>
    PassengerUser example
    PassengerGroup example
  </IfModule>

  <IfModule alias_module>
    ScriptAlias /cgi-bin/ /home/example/public_html/api/public/cgi-bin/
  </IfModule>





  # To customize this VirtualHost use an include file at the following location
  # Include "/etc/apache2/conf.d/userdata/std/2_4/example/api.example.gr/*.conf"
</VirtualHost>
<VirtualHost 1|example-ip|:443>
  ServerName api.example.gr
  ServerAlias www.api.example.gr
  DocumentRoot /home/example/public_html/api/public
  ServerAdmin webmaster@api.example.gr
  UseCanonicalName Off

  ## User example # Needed for Cpanel::ApacheConf
  <IfModule userdir_module>
    <IfModule !mpm_itk.c>
      <IfModule !ruid2_module>
        <IfModule !mod_passenger.c>
          UserDir enabled example
        </IfModule>
      </IfModule>
    </IfModule>
  </IfModule>

  # Enable backwards compatible Server Side Include expression parser for Apache versions >= 2.4.
  # To selectively use the newer Apache 2.4 expression parser, disable SSILegacyExprParser in
  # the user's .htaccess file.  For more information, please read:
  #    http://httpd.apache.org/docs/2.4/mod/mod_include.html#ssilegacyexprparser
  <IfModule mod_include.c>
    <Directory "/home/example/public_html/api/public">
      SSILegacyExprParser On
    </Directory>
  </IfModule>


  <Proxymatch ^https?://127\.0\.0\.1:(2082|2083|2077|2078|2079|2080|2086|2087|2095|2096)/>
       <IfModule security2_module>
          SecRuleEngine Off
       </IfModule>
  </Proxymatch>

  <IfModule mod_suphp.c>
    suPHP_UserGroup example example
  </IfModule>
  <IfModule suexec_module>
    <IfModule !mod_ruid2.c>
      SuexecUserGroup example example
    </IfModule>
  </IfModule>
  <IfModule ruid2_module>
    RMode config
    RUidGid example example
  </IfModule>
  <IfModule mpm_itk.c>
    # For more information on MPM ITK, please read:
    #   http://mpm-itk.sesse.net/
    AssignUserID example example
  </IfModule>
  <IfModule mod_passenger.c>
    PassengerUser example
    PassengerGroup example
  </IfModule>

  <IfModule alias_module>
    ScriptAlias /cgi-bin/ /home/example/public_html/api/public/cgi-bin/
  </IfModule>
  <IfModule ssl_module>
    SSLEngine on

    SSLCertificateFile /var/cpanel/ssl/apache_tls/api.example.gr/combined

    SetEnvIf User-Agent ".*MSIE.*" nokeepalive ssl-unclean-shutdown
    <Directory "/home/example/public_html/api/public/cgi-bin">
      SSLOptions +StdEnvVars
    </Directory>
  </IfModule>




  # To customize this VirtualHost use an include file at the following location
  # Include "/etc/apache2/conf.d/userdata/ssl/2_4/example/api.example.gr/*.conf"

</VirtualHost>

请注意,我的实际API的ip和域尚未被示例替换:

正面网址: http://example.gr

API网址: http://api.example.gr

2 个答案:

答案 0 :(得分:0)

似乎apache正在删除授权标头。所以试试这个

来自

RewriteCond %{HTTP:Authorization} .+
RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]

RewriteCond %{HTTP:Authorization} .
RewriteRule ^ - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]

regex表达式有点不同。该配置是从symfony / apache-pack的默认.htaccess文件中直接复制/粘贴的,您可以在此处找到 symfony/apache-pack

答案 1 :(得分:0)

问题终于解决了!这是一个权限问题。我将文件夹的所有内容默认设置为755,将文件默认为644,并显示HTTP_AUTHORIZATION标头。