PHP Angular - JWT 授权承载令牌

Posted

技术标签:

【中文标题】PHP Angular - JWT 授权承载令牌【英文标题】:PHP Angular - JWT Authorization Bearer Token 【发布时间】:2020-08-28 05:32:54 【问题描述】:

我正在尝试获取通过 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());
    

我在控制台记录了查看输出的请求,并且它具有令牌。

然后我转到开发人员工具的网络选项卡以查看令牌是否在请求中并且它在那里。

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

【问题讨论】:

【参考方案1】:

你好,我说西班牙语,但我也有同样的情况,我会告诉你我采取了哪种方式

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

在 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()
    ));


?>

如果你评论我会编辑

【讨论】:

谢谢。您提供的链接中的 .htaccess 修复程序为我解决了这个问题。谢谢【参考方案2】:

在位于 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];

【讨论】:

以上是关于PHP Angular - JWT 授权承载令牌的主要内容,如果未能解决你的问题,请参考以下文章

了解 JWT 和 HTTP 授权标头? (客户端:Angular,服务器:php)

Angular JWT 拦截器切换承载令牌以进行刷新

如何使用 openapi-ui 和承载令牌(jwt)在 swagger-ui 中激活授权按钮?

发送带有承载令牌授权标头 (flask_restful + flask_jwt_extended) 的 GET 消息时出现“段不足”

AuthTokenAccessException:无法解码JWT承载:没有JWT承载存在于“授权”的请求头

当它是具有 angular2 的外部源时,标头中没有 jwt 令牌授权