在 PHP 中,获取到 Bearer Token 后,下一步通常是验证令牌的有效性,并根据令牌中的信息处理请求。以下是详细的步骤和代码示例:


1. 获取 Authorization 头中的令牌

首先,从 HTTP 请求头中提取 Authorization 字段,并解析出 Bearer Token

<?php
// 获取 Authorization 头
$headers = getallheaders();
$authHeader = $headers['Authorization'] ?? ''; // 检查是否包含 Bearer 前缀
if (strpos($authHeader, 'Bearer ') === 0) {
// 提取令牌
$token = substr($authHeader, 7);
} else {
// 如果没有 Bearer 前缀,返回错误
http_response_code(401);
echo json_encode(['error' => 'Invalid token format']);
exit;
}
?>

2. 验证令牌的有效性

获取到令牌后,需要验证其有效性。常见的验证方式包括:

  • JWT 令牌:解析并验证签名、有效期等。
  • Opaque 令牌:向授权服务器发送请求验证令牌。

以下以 JWT 令牌为例:

(1)安装 JWT 库

使用 firebase/php-jwt 库来解析和验证 JWT 令牌。

composer require firebase/php-jwt

(2)验证 JWT 令牌

<?php
require 'vendor/autoload.php';
use Firebase\JWT\JWT;
use Firebase\JWT\Key; $secretKey = 'your-secret-key'; // 用于验证签名的密钥 try {
// 解码并验证令牌
$decoded = JWT::decode($token, new Key($secretKey, 'HS256')); // 令牌验证通过,可以访问解码后的数据
$userId = $decoded->user_id; // 例如:获取用户 ID
$role = $decoded->role; // 例如:获取用户角色 // 继续处理请求
echo json_encode(['user_id' => $userId, 'role' => $role]);
} catch (Exception $e) {
// 令牌无效
http_response_code(401);
echo json_encode(['error' => 'Invalid token: ' . $e->getMessage()]);
exit;
}
?>

3. 根据令牌信息处理请求

验证令牌后,可以根据令牌中的信息(如用户 ID、角色等)执行相应的业务逻辑。

示例:根据用户角色返回不同数据

<?php
// 假设 $decoded 是解码后的令牌数据
$role = $decoded->role; if ($role === 'admin') {
// 管理员权限
echo json_encode(['message' => 'Welcome, Admin!']);
} elseif ($role === 'user') {
// 普通用户权限
echo json_encode(['message' => 'Welcome, User!']);
} else {
// 无权限
http_response_code(403);
echo json_encode(['error' => 'Access denied']);
exit;
}
?>

4. 返回响应

根据业务逻辑处理完成后,返回相应的 HTTP 响应。

示例:返回 JSON 数据

<?php
header('Content-Type: application/json');
echo json_encode([
'status' => 'success',
'data' => [
'user_id' => $userId,
'role' => $role,
],
]);
?>

5. 完整代码示例

以下是一个完整的 PHP 示例,包括获取令牌、验证令牌和处理请求:

<?php
require 'vendor/autoload.php';
use Firebase\JWT\JWT;
use Firebase\JWT\Key; // 获取 Authorization 头
$headers = getallheaders();
$authHeader = $headers['Authorization'] ?? ''; // 检查是否包含 Bearer 前缀
if (strpos($authHeader, 'Bearer ') === 0) {
$token = substr($authHeader, 7);
} else {
http_response_code(401);
echo json_encode(['error' => 'Invalid token format']);
exit;
} // 验证 JWT 令牌
$secretKey = 'your-secret-key'; // 用于验证签名的密钥 try {
$decoded = JWT::decode($token, new Key($secretKey, 'HS256')); // 令牌验证通过,处理请求
$userId = $decoded->user_id;
$role = $decoded->role; if ($role === 'admin') {
echo json_encode(['message' => 'Welcome, Admin!']);
} elseif ($role === 'user') {
echo json_encode(['message' => 'Welcome, User!']);
} else {
http_response_code(403);
echo json_encode(['error' => 'Access denied']);
}
} catch (Exception $e) {
http_response_code(401);
echo json_encode(['error' => 'Invalid token: ' . $e->getMessage()]);
}
?>

6. 总结

  1. 获取令牌:从 Authorization 头中提取 Bearer Token
  2. 验证令牌:使用 JWT 库或其他方式验证令牌的有效性。
  3. 处理请求:根据令牌中的信息(如用户 ID、角色等)执行业务逻辑。
  4. 返回响应:根据处理结果返回相应的 HTTP 响应。

通过这种方式,可以确保只有持有有效令牌的客户端才能访问受保护的资源。

deepseek:以php为例,获取令牌后下一步处理步骤的更多相关文章

  1. javascript中如何使用js脚本模拟"request"获取url后参数值呢?

    转自:猫猫小屋--js获取url后参数信息 摘要: 下文讲述javascript中使用js代码获取url地址后面的参数值的方法分享,如下所示: 实现思路: 使用正则表达式对参数值进行匹配,获取参数后的 ...

  2. Jquery插件实现点击获取验证码后60秒内禁止重新获取

    通过jquery.cookie.js插件可以快速实现“点击获取验证码后60秒内禁止重新获取(防刷新)”的功能 先到官网(http://plugins.jquery.com/cookie/ )下载coo ...

  3. 简单的 Android 拍照并显示以及获取路径后上传

    简单的 Android 拍照并显示以及获取路径后上传 Activity 中的代码,我只贴出重要的事件部分代码 public void doPhoto(View view) { destoryBimap ...

  4. selenium获取元素后用click()点击没有作用,用Keys.ENTER就可以成功

    selenium获取元素后用click()点击没有作用,用键盘输入enter(Keys.ENTER)就可以成功 #coding = utf-8 from selenium import webdriv ...

  5. Jquery UI 中的datepicker() ,获取日期后的回调函数onClose()

    <head> //引入相关的css/js <link rel="stylesheet" href="//code.jquery.com/ui/1.10. ...

  6. 【javascript】js 获取 url 后的参数值

    以前写过一篇类似的博文(提取 url 的搜索字符串中的参数),但是个人觉得使用起来不是很方便,今天抽空重新写了个函数,该函数代码更加简洁. //获取 url 后的参数值 function getUrl ...

  7. SQL获取分组后取某字段最大一条记录(求每个类别中最大的值的列表)

    获取分组后取某字段最大一条记录 方法一:(效率最高) select * from test as a where typeindex = (select max(b.typeindex) from t ...

  8. HttpClient4.3.3 使用样例—获取静态资源

    HttpClient4.3.3 使用样例—获取静态资源 学习了:http://shihlei.iteye.com/blog/2067688

  9. 获取分组后的TOP 1和TOP N记录

    MySQL获取分组后的TOP 1和TOP N记录 有时会碰到一些需求,查询分组后的最大值,最小值所在的整行记录或者分组后的top n行的记录,在一些别的数据库可能有窗口函数可以方面的查出来,但是MyS ...

  10. 客户端的javascript改变了asp.net webform页面控件的值,后台代码中如何获取修改后的值。

    客户端的javascript改变了asp.net webform页面控件的值,后台代码中如何获取修改后的值.     无论是什么的html控件,只要加上了runat="server" ...

随机推荐

  1. 实用干货分享 - Oracle数据库RPM部署指南

    下载依赖和Oracle19c版本的RPM包 http://yum.oracle.com/repo/OracleLinux/OL7/latest/x86_64/getPackage/oracle-dat ...

  2. arm mattermost

    It's not so hard, here is my working steps for arm64 device. cd ~/build/mattermost wget https://raw. ...

  3. docker.sock: connect: permission denied 解决

    问题描述xjun@DESKTOP-L2R4GKN:~$ docker run -it hello-worlddocker: Got permission denied while trying to ...

  4. Gitlab 实现仓库完全迁移

    方法一:最快 gitlab用url导入注意事项看图 方法二 首先需要在新的服务服务器上新建一个项目 然后用 Git Bash 执行以下命令 git clone --mirror 项目原代码仓库地址 / ...

  5. Qt/C++编写视频监控系统80-远程回放视频流

    一.前言 远程回放NVR或者服务器上的视频文件,一般有三种方式,第一种是调用厂家的SDK,这个功能最全,但是缺点明显就是每个厂家的设备都有自己的SDK,只兼容自家的设备,如果你的软件需要接入多个厂家的 ...

  6. 前端之canvas实现电子签约完成线上签署功能

    最近发现现在租房还是签合同,越来越多采用电子签约的方式进行,好处不用多说节约成本,节约时间.抱着好奇的心理,尝试自己动手实现一个电子签.原来并不复杂主要通过了canvas绘画能力进行实现的. 主要功能 ...

  7. Redis 实战篇——Redis 客户端(Jedis,Luttece,Redisson)

    一.Jedis,Redisson,Lettuce三者的区别 共同点:都提供了基于Redis操作的Java API,只是封装程度,具体实现稍有不同. 不同点: 1.1.Jedis 是Redis的Java ...

  8. docker没有vi不能执行yum报Device or resource busy

    最近在使用docker的过程中发现一个问题,就是想用vim编辑器编辑一个文件,发现连vi都没有. 于是想到一个办法用docker cp来解决问题: 首先执行docker ps -a查看容器的id 然后 ...

  9. CCS(TI IDE)中英文切换

    介绍 使用CSS时会遇到中英文切换的问题,使用中文可以方便我们更好的开发,但是由于一些专业名词的原因我们有时候又需要英文环境,所以中英文切换就显得十分重要. 由于CCS基于eclipse开发,所以CC ...

  10. SM9-密钥封装

    算法过程 代码实现 ///************************************************************************ // File name: ...