我已经使用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
用户代理: 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
答案 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标头。