【问题标题】:Authorization don't pass in request AngularJs/PHP授权不传入请求AngularJs/PHP
【发布时间】:2018-11-07 19:12:41
【问题描述】:

我正在实施 JWT 身份验证,但标题中设置的授权有问题。

看起来请求中没有设置“授权”标头。

我收到了客户端发送的 2 个请求,第一个,请求中的 Authorization 标头传递:

// 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');

标头中的授权传递

【问题讨论】:

    标签: php angularjs jwt core


    【解决方案1】:

    删除$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");
        }]);
    

    我认为你的脚本的重新安排会导致问题,将你的控制器脚本放在底部

    类似的东西

    并在您的 ma​​in.js 中删除 var app = angular.module('App', ['ngMaterial', 'ngMessages']) 因为我们把它放在了index.html

    【讨论】:

    • 首先,感谢您抽出宝贵时间回复@John。我已经尝试过你的解决方案,但我不太确定如何调用这个工厂。我创建了一个名为“authInterceptor”的新文件并粘贴了这段代码。在我的主控制器中,我在构造函数中添加了“authInterceptor”,现在我的控制台中出现了一个邪恶的错误:Error: [$injector:unpr]。我是这样称呼这个工厂的:app.controller('Ctrl', ['$rootScope', '$scope','$http','$timeout','$mdDialog','authInterceptor',... function($rootScope, $scope, $http){...}
    • 不,不要把它加到控制器里,把它放在那里,authInterceptor的唯一用途是拦截传入的请求,这意味着你所有的请求都会先绑定在那里。
    • 同样的问题,第一次请求发送授权,第二次没有。
    • 非常感谢您抽出宝贵时间。这是plunker:plnk,第一个请求是在projects.js l.6上,第二个是在user.js l.5上,我只是复制/粘贴它应该有趣的内容,如果你需要更多,问我.
    • 您的plunk是空的,请重新检查
    猜你喜欢
    • 2019-05-17
    • 1970-01-01
    • 2014-12-01
    • 2011-02-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-11
    • 2018-05-27
    相关资源
    最近更新 更多