PHP Angular-JWT授权承载令牌

时间:2020-05-12 11:33:23

标签: php angular http-headers jwt jwt-auth

我正在尝试将授权令牌通过angular发送到php。我的角度拦截器外观如下

intercept(req: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {
    if (localStorage.getItem('token') != null) {
        const clonedReq = req.clone({
            headers: req.headers.set('Authorization', 'Bearer ' + localStorage.getItem('token'))
        });
        return next.handle(clonedReq).pipe(
            tap(
                succ => { },
                err => {
                    if (err.status == 401){
                        localStorage.removeItem('token');
                        localStorage.removeItem('username');
                        this.router.navigateByUrl('/user/login');
                    }
                }
            )
        )
    }
    else {
        return next.handle(req.clone());
    }
}

我在控制台上记录了查看输出的请求,该请求具有令牌。 enter image description here

然后我转到开发人员工具的“网络”选项卡,以查看令牌是否在请求中以及是否在其中。 enter image description here

现在如何在php中获取令牌?我尝试遵循此question的答案。但这也无济于事。以下是使用以上答案中的代码时的输出。

enter image description here

2 个答案:

答案 0 :(得分:1)

您好,我说西班牙语,但我的处境相同,我要告诉您我采取哪种方式

搜索google,在这里我发现您必须在$ _SERVER ['HTTP_AUTHORIZATION']中接收JWT,但这至少在我的共享主机中不起作用,我尝试播放.htaccess文件,但是什么也没有,您可以请在此处查看详细信息[Apache 2.4 + PHP-FPM and Authorization headers,您也可以通过JSON格式通过angular将JWT发送到您的php文件,但是如果您要通过GET或POST发送数据,我建议您使用HttpClientModule而不是HttpRequest,< / p>

在PHP中,这是我的测试文件,我在URL中发送了JWT,这不是执行令牌的最佳方式,但就我而言,我希望它能起作用。

<?php
header("Access-Control-Allow-Origin: *");
header("Content-Type: application/json; charset=UTF-8");
header("Access-Control-Allow-Methods: GET, POST");
header("Access-Control-Max-Age: 3600");
header("Access-Control-Allow-Headers: Content-Type, Access-Control-Allow-Headers, Authorization, X-Requested-With");

require_once 'jwt/src/BeforeValidException.php';
require_once 'jwt/src/ExpiredException.php';
require_once 'jwt/src/SignatureInvalidException.php';
require_once 'jwt/src/JWT.php';
use \Firebase\JWT\JWT;

$llave = 'TULLAVESECRETA';

$authHeader = $_GET['tok'];

try{
$decoded = JWT::decode($authHeader, $llave, array('HS256'));
        echo json_encode($decoded);
}
catch(Exception $e){
    http_response_code(200);
    echo json_encode(array(
        "mensaje" => "Vuelve a iniciar sesion.",
        "error" => $e->getMessage()
    ));
}

?>

如果您发表评论,我会进行编辑

答案 1 :(得分:0)

在位于 api 文件夹的 .htaccess 文件中包含以下几行:

RewriteEngine On
RewriteCond %{HTTP:Authorization} ^(.*)
RewriteRule .* - [e=HTTP_AUTHORIZATION:%1]

完整答案:Authorization header missing in PHP POST request

然后您可以使用 $_SERVER['HTTP_AUTHORIZATION']

读取您的“Bearer”+令牌
$requestHeaders = apache_request_headers();
$token = $requestHeaders["Authorization"]; 

您仍然需要从 $token 中去除“Bearer”文本。

if (preg_match('/Bearer\s(\S+)/', $_SERVER['HTTP_AUTHORIZATION'], $matches)) {
// alternately '/Bearer\s((.*)\.(.*)\.(.*))/' to separate each JWT string
    $stripped_token =  $matches[1];
}