PHP Angular - JWT 授权承载令牌
PHP Angular - JWT Authorization Bearer Token
我正在尝试获取 angular 发送给 php 的授权令牌。我的 angular 拦截器如下所示
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 中获取令牌?我尝试按照此 的答案进行操作。但这也无济于事。以下是使用上述答案中的代码时的输出。
嗨,我会说西班牙语,但我也是同样的情况,我会告诉你我选择了哪条路
搜索 google 并且在这里我发现你必须在 $_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()
));
}
?>
如果你评论我会编辑
在位于 api 的文件夹中的 .htaccess 文件中包含以下行:
RewriteEngine On
RewriteCond %{HTTP:Authorization} ^(.*)
RewriteRule .* - [e=HTTP_AUTHORIZATION:%1]
完整答案在这里:Authorization header missing in PHP POST request
然后你可以用$_SERVER['HTTP_AUTHORIZATION']
或
读取你的“Bearer”+token
$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];
}
我正在尝试获取 angular 发送给 php 的授权令牌。我的 angular 拦截器如下所示
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 中获取令牌?我尝试按照此
嗨,我会说西班牙语,但我也是同样的情况,我会告诉你我选择了哪条路
搜索 google 并且在这里我发现你必须在 $_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()
));
}
?>
如果你评论我会编辑
在位于 api 的文件夹中的 .htaccess 文件中包含以下行:
RewriteEngine On
RewriteCond %{HTTP:Authorization} ^(.*)
RewriteRule .* - [e=HTTP_AUTHORIZATION:%1]
完整答案在这里:Authorization header missing in PHP POST request
然后你可以用$_SERVER['HTTP_AUTHORIZATION']
或
$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];
}