React Native Android使用fetch与服务器通讯无法读取Authorization
场景:
iOS使用fetch和curl 发送信息时候设置headers: {Authorization: token},
服务器都可以返回正确验证信息。
但是Android下使用fetch就不可以。
时间不允许,就放弃琢磨java代码了,所以另辟蹊径:服务器直接返回客户端提交的header信息,对比一下。
1 2 3 4 5 |
# curl返回 只摘取关键信息 { ... Authorization: euyasuipfk230ueiwoqj... .... |
1 2 3 4 5 |
# android 模拟器 FETCH 返回信息 { ... authorization: euyasuipfk230ueiwoqj... .... |
有大小写的区别?
服务器君没有大小写一视同仁么?
他是这么读取这个header信息的(忽略异常验证)
1 |
$header_info = getallheaders()['Authorization'] |
想了想服务器系统是CentOS,对大小写相当敏感,于是做进一步验证:
鉴于curl正常工作,那么设置curl的headers的Authorization为全小写authorization。
然后清理下服务器缓存,再次发送请求,嗯,服务器拒绝了我的请求。
到这里可以确定是服务器在度数组时候,键的大小写影响了结果。
问题找到了就好解决了:
祭出函数array_change_key_case 可参考
功能:返回键为大写或小写的数组,或者如果 array 非数组则返回 FALSE。
函数原型:array array_change_key_case ( array $input [, int $case = CASE_LOWER ] )
用下面的方式读取headers信息即可。
1 2 |
$header_info = array_change_key_case(getallheaders()); $auth = $header_info['authorization']; // token信息 |
- 另外一种方式
php的自定义头信息都可以使用$_SERVER[‘HTTP_*’]来获取,如header(‘test: wzhtest’);获取的时候,我们可以使用$_SERVER[‘HTTP_TEST’]来获取。
- 这里说明下。Authorization可能是个例外。nginx没问题,但是Apache下可能会出现一个问题。那就是我们使用$_SERVER[‘HTTP_AUTHORIZATION’]可能就获取不到值。
解决办法可参考:
http://symfony.com/doc/current/setup/web_server_configuration.html#using-mod-proxy-fcgi-with-apache-2-4
1 2 3 4 5 6 7 8 9 |
<VirtualHost *:80> ServerName domain.tld ServerAlias www.domain.tld # Uncomment the following line to force Apache to pass the Authorization # header to PHP: required for "basic_auth" under PHP-FPM and FastCGI # SetEnvIfNoCase ^Authorization$ "(.+)" HTTP_AUTHORIZATION=$1 ··· |