Я реализую аутентификацию JWT, и у меня проблема с авторизацией, установленной в заголовке.
Похоже, что в запросе не установлен заголовок «Авторизация».
Я получил 2 запроса, отправленные клиентом, первый, заголовок авторизации прошел в запросе:
// GET PROJECTS NAME
projects.getName = () => { // === projects.getName = function() { ... }
return $http.get(Global.url_api+'action=GETINFO&table=Projects');
}
Запрос в браузере:
Accept: application/json, text/plain, */*
Accept-Encoding: gzip, deflate
Accept-Language: fr-FR,fr;q=0.9,en-US;q=0.8,en;q=0.7
Authorization: Bearer eyJ0eXAiOiJKV1QiLCJhbGciOi....
Host: *******-tpinst.fr
Origin: http://localhost:2000
Proxy-Connection: keep-alive
Referer: http://localhost:2000/
User-Agent: Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36
(KHTML, like Gecko) Chrome/66.0.3359.181 Safari/537.36
Но мой второй запрос, реализованный так же, как и первый, не прошел этот заголовок авторизации:
users.get = function(project){
return $http.get(Global.url_api+'action=GET&table='+project+'_users');
}
В браузере:
Accept: */*
Accept-Encoding: gzip, deflate
Accept-Language: fr-FR,fr;q=0.9,en-US;q=0.8,en;q=0.7
Access-Control-Request-Headers: authorization
Access-Control-Request-Method: GET
Host: bouygues-tpinst.fr
Origin: http://localhost:2000
Proxy-Connection: keep-alive
User-Agent: Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36
(KHTML, like Gecko) Chrome/66.0.3359.181 Safari/537.36
Авторизация устанавливается в основной программе:
app.config(['$httpProvider', function($httpProvider) {
$httpProvider.defaults.headers.common['Authorization'] = 'Bearer
'+localStorage.getItem('tokenAPI');
}])
Я установил Разрешить происхождение на моей стороне сервера следующими строками:
header('Access-Control-Allow-Origin: *');
header('Access-Control-Allow-Methods: GET, POST, PATCH, PUT, DELETE,
OPTIONS');
header('Access-Control-Allow-Headers: Origin, Content-Type, Authorization');
Я новичок в этих понятиях безопасности, пожалуйста, помогите мне
РЕДАКТИРОВАТЬ :
Я только что нашел подсказку, в моем api.php я получил эту строку для отправки клиенту ошибки 401:
$Authorization = $_SERVER['HTTP_AUTHORIZATION'];
//Looking for authorization headers
if ($Authorization){ ... }
else {
header('HTTP/1.0 401 Unauthorized'); //Give error code 401
echo 'Token not found in the header';
}
Когда я удаляю
header('HTTP/1.0 401 Unauthorized');
Проход авторизации в заголовке






Удалите $httpProvider.defaults.headers.common
вместо этого реализуйте перехватчик http
Попробуй это
app.factory("authInterceptor", authInterceptor);
authInterceptor.$inject = ["$q"];
function authInterceptor($q) {
return {
// Add an interceptor for requests.
'request': function (config) {
// Default to an empty object if no headers are set.
config.headers = config.headers || {};
// Set the token
var token = localStorage.getItem('tokenAPI');
config.headers.Authorization = "Bearer " + token;
return config;
},
// Add an interceptor for any responses that error.
'responseError': function (response) {
// Check if the error is auth-related.
if (response.status === 401 || response.status === 403) {
}
return $q.reject(response);
}
};
}
app.config(["$httpProvider",
function ($httpProvider) {
//Registers the interceptor
$httpProvider.interceptors.push("authInterceptor");
}]);
И я думаю, что перестановка ваших скриптов вызывает проблему, поместите свой скрипт контроллера внизу
что-то вроде этого
И в вашем main.js удалите
var app = angular.module('App', ['ngMaterial', 'ngMessages']), потому что мы поместили его в index.html
нет, не добавляйте его к контроллеру, просто оставьте его там, единственное использование authInterceptor - это перехват входящего запроса, то есть весь ваш запрос будет сначала привязан к нему.
Та же проблема, первый запрос авторизации отправки, а второй нет.
Большое спасибо, что уделили мне время. Вот плункер: plnk, первый запрос на projects.js l.6, второй на user.js l.5, я просто копирую / вставляю то, что должно быть интересно, если вам нужно больше, спросите меня.
Ваш планшет пуст, проверьте еще раз
В вашем плункере много ошибок, в чем сейчас ошибка вашей консоли?
Во-первых, спасибо, что нашли время ответить @John. Я пробовал ваше решение, но не совсем уверен, как назвать эту фабрику. Я создал новый файл с именем «authInterceptor» и вставил этот код. И в моем основном контроллере я добавил "authInterceptor" в конструктор и теперь получил ужасную ошибку в моей консоли:
Error: [$injector:unpr]. Вот как я назвал эту фабрику:app.controller('Ctrl', ['$rootScope', '$scope','$http','$timeout','$mdDialog','authInterceptor',... function($rootScope, $scope, $http){...}