Я использую SlimFramework
Когда я запускаю свой скрипт locali с помощью xampp, он отлично работает. Но я загрузил сценарий на сервер, и теперь он искривляет ошибку, что заголовок не был установлен.
XHR не разрешает загрузку GET-запроса. или изменить определение метода в настройках.
Здесь сценарий в угловом
$rootScope.globals = $cookies.getObject('globals') || {}; if ($rootScope.globals.currentUser) { $http.defaults.headers.common['Authorization'] = 'Basic ' + $rootScope.globals.currentUser.token; } $rootScope.$on('$locationChangeStart', function (event, next, current) { var restrictedPage = $.inArray($location.path(), ['/login', '/register', '/password']) === -1; var loggedIn = $rootScope.globals.currentUser; if (restrictedPage) { if (!loggedIn) { $location.path('/login'); } else { UserService.checkToken($rootScope.globals.currentUser.token) .then(function (response) { if (!response.success) { $location.path('/login'); } }); } } });
function checkToken(token) { return $http.get('api/v1/token').then(handleCallback, handleCallback); } function handleCallback(res) { console.log(res); return res.data; }
И вот сценарий с SlimFramework
$config['displayErrorDetails'] = true; $config['addContentLengthHeader'] = false; $config['determineRouteBeforeAppMiddleware'] = true; $app = new \Slim\App(["settings" => $config]); $container = $app->getContainer(); // This is the middleware // It will add the Access-Control-Allow-Methods header to every request $app->add(function ($req, $res, $next) { $response = $next($req, $res); return $response ->withHeader('Access-Control-Allow-Origin', '*') ->withHeader('Access-Control-Allow-Headers', 'X-Requested-With, Content-Type, Accept, Origin, Authorization') ->withHeader('Access-Control-Allow-Methods', 'GET, POST, PUT, DELETE, OPTIONS'); }); $app->get('/token', function ($request, $response){ $token = $request->getHeaderLine('Authorization'); if($token){ $db = new DbOperation(); if($db->checkAuthentication($token)){ $return = $response->withJson(["success"=> true], 200); } else { $return = $response->withJson([ "success"=> false, "message"=>'Invalid token' ], 403); } } else { $return = $response->withJson([ "success"=> false, "message"=>'Header not set.' ], 403); } return $return; });
В чем моя проблема? Все знают?
Спасибо
UPDATE: Получить запрос
Ответ от тестирования API
HTTP/1.1 403 Forbidden Server: nginx Date: Mon, 27 Mar 2017 11:57:27 GMT Content-Type: application/json;charset=utf-8 Transfer-Encoding: chunked Connection: keep-alive X-Powered-By: PHP/5.6.30 Access-Control-Allow-Origin: * Access-Control-Allow-Headers: X-Requested-With, Content-Type, Accept, Origin, Authorization Access-Control-Allow-Methods: GET X-Powered-By: PleskLin
если вы хотите открыть вызов api to cors для всех возможных источников (только для теста), попробуйте это:
$app->add(function ($req, $res, $next) { $response = $next($req, $res); return $response ->withHeader('Access-Control-Allow-Origin', '*') ->withHeader('Access-Control-Allow-Headers', 'X-Requested-With, Content-Type, Accept, Origin, Authorization') ->withHeader('Access-Control-Allow-Methods', 'GET, POST, PUT, DELETE, OPTIONS'); });
Или есть это промежуточное ПО, которое делает то же самое: https://github.com/palanik/CorsSlim
Если вы не уверены, что такое имя заголовка, сгенерированное NG, вы можете отлаживать заголовок, отправленный в SLIM. В SLIM это можно сделать следующим образом:
$headers = $request->getHeaders(); foreach ($headers as $name => $values) { echo $name . ": " . implode(", ", $values); }
Я использую jquery, я устанавливаю токен в заголовке глобально, например:
$.ajaxPrefilter(function( options, oriOptions, jqXHR ) { jqXHR.setRequestHeader("Authorization", sessionStorage.token); });
Это отправит токен с именем заголовка:
HTTP_AUTHORIZATION
Чтобы получить конкретную переменную заголовка:
$token_array = $request->getHeader('HTTP_AUTHORIZATION'); if (count($token_array) == 0) { $data = Array( "jwt_status" => "token_not_exist" ); return $response->withJson($data, 401) ->withHeader('Content-type', 'application/json'); } $token = $token_array[0];