我是新的反应,主要是JavaScript。 我正在使用为localhost:3000托pipe的Web应用程序,它使用node.js和symfony 2.8作为我的后端,托pipe在localhost:80上,使用apache提供了一个由lexik和fos用户保护的api。 在确保api之前,一切正常。 在获取api之后,使用fetch获取401错误如下:
let myToken = localStorage.getItem('auth_token') //token properly retrieved let myHeaders = new Headers(); myHeaders.append("Authorization", myToken) return fetch( pathToMyResource, { method: "post", headers: myHeaders } ).then(do stuff with the answer)
这使我在预检请求的答案的标题中出现以下错误:
Request URL:http://127.0.0.1/edsa-food_app_symfony_2.8/api/site/1/get Request Method:OPTIONS Status Code:401 Unauthorized Remote Address:127.0.0.1:80 Referrer Policy:no-referrer-when-downgrade
答案是:
{"code":401,"message":"JWT Token not found"}
我也检查过,只是因为我真的不明白这是如何工作的
credentials: 'include'
和
mode: 'no-cors'
但没有更成功。
当我使用PHP从localhost:8000构build和发送这个相同的请求时,它完美的工作。 我使用下面的代码:
$url = pathToMyResource $options = array( 'http' => array( 'header' => "Authorization: Bearer $token" 'method' => 'POST', ) ); $context = stream_context_create($options); $result = file_get_contents($url, false, $context); var_dump($result);
如果我理解的很好,不能在Lexik JWT Token中描述的apache错误没有find :任何symfony 2.8项目的根目录下默认的.htaccess包括:
RewriteEngine On RewriteCond %{REQUEST_URI}::$1 ^(/.+)/(.*)::\2$ RewriteRule ^(.*) - [E=BASE:%1]
我检查和mod_rewrite启用。
以下是Chrome中报告的标题:
**General** Request URL:http://127.0.0.1/edsa-food_app_symfony_2.8/api/site/1/get Request Method:OPTIONS Status Code:401 Unauthorized Remote Address:127.0.0.1:80 Referrer Policy:no-referrer-when-downgrade **Response Headers** view source Access-Control-Allow-Origin:* Cache-Control:no-cache Connection:Keep-Alive Content-Length:44 Content-Type:application/json Date:Tue, 08 Aug 2017 01:05:20 GMT Keep-Alive:timeout=5, max=100 Server:Apache/2.4.18 (Win32) PHP/5.6.19 WWW-Authenticate:Bearer X-Powered-By:PHP/5.6.19 **Request Headers** view source Accept:*/* Accept-Encoding:gzip, deflate, br Accept-Language:en-GB,en;q=0.8,en-US;q=0.6,fr;q=0.4,zh-CN;q=0.2,zh;q=0.2,it;q=0.2 Access-Control-Request-Headers:authorization Access-Control-Request-Method:POST Connection:keep-alive Host:127.0.0.1 Origin:http://localhost:3000 Referer:http://localhost:3000/service-worker.js User-Agent:Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.90 Safari/537.36
而对于POST请求本身:
**General** Request URL:http://127.0.0.1/edsa-food_app_symfony_2.8/api/site/1/get Referrer Policy:no-referrer-when-downgrade **Request Headers** Provisional headers are shown authorization:Bearer eyJhbGciOiJSUzI1NiJ9.eyJyb2xlcyI6WyJST0xFX1VTRVIiXSwidXNlcm5hbWUiOiJhbnRvaW5lIiwiaWF0IjoxNTAyMTM4ODUwLCJleHAiOjE1MDIyMjUyNTB9.wpWZZLf5wWjrU0-eAQUR0XiDTvf1jRtiJuGIHoYm7Yo4lGhOn-_bYuJIdv71ZUiuYfaaMxOW4xzXN3JjB9KfrWmXD4jqI6CnHFYZISGlYvAGJayD_z8CMIEdvrMXrbb6_nEc0CaB68BOf7wqJyoNatFKlepwmCHevsRtTIbhc_GviQf_U_Fw30ShtogIJBLqmVD4ex-j0_9QbblAIqNhc8c0thEFYtN7FVepLehCzBNCTNL8l-mxYEFTrUYLKwSt4lRahgTsv4Ozhxl300xz7BbdQEr3ph2i4ssVcvokpEO2C07QicWSwXFx1Vx-2a6XbkoeorTz_P7WstBzinMdv0etlIz2VYN_oUmHaxDu9jlsu90nZlL2Ea7Ak7dSJaNYzmB11yga_OSiWMpzWTjaqP3MLJuS1O5keHMbliERgnBJM_rsMZ-mkVSM8j4t31L1QJCfP0RW-Vfj3biYR1uYNfXwbbdqmIpn6b39qOCY9l4F99dK6R-PKq5ZeBHEfy-OpN39NFmaMQQX5gYCQ3TzVdeou6-hjpqRnNl8dc0HYzAl3fbU102JMefZNvCsIdcI6WDCiyWZO9Viy-z9REAVF4Pr9bLFpc-Q6Lqdj32lt1-yy6i75IOavrPqRilhRh2z_V7rP_DqahrLhFSDPPVg_gcqb8n31_6q3wtyzx16aJ4 Origin:http://localhost:3000 Referer:http://localhost:3000/restaurant User-Agent:Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.90 Safari/537.36
我搞不清楚了。
您需要配置您的后端,以便以200或204响应预检。
您可以通过添加您的Apache配置来处理Apache级别的问题:
RewriteEngine On RewriteCond %{REQUEST_METHOD} OPTIONS RewriteRule ^(.*)$ $1 [R=200,L]
但是,如果这不能解决,那么你就需要进一步挖掘,并找出你的后端系统的哪些部分导致认证是必需的OPTIONS
请求。
原因是因为这里发生的是这样的:
Authorization
标头的请求。 Authorization
头的请求要求我做一个CORS预检OPTIONS
,以确保服务器允许使用该头的请求。 OPTIONS
请求发送到没有Authorization
标头的服务器 – 因为OPTIONS
检查的全部目的是查看是否可以发送该请求。 OPTIONS
请求,而不是以一种表示它允许在请求中Authorization
的方式来响应它,而是因为它缺少该标题而拒绝它。 POST
请求。