在 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. Delon ACL

    Delon ACL delon ACL Alain acl 路由守卫 使用 ACLService 核心是 ACLService,See:https://github.com/ng-alain/delo ...

  2. iOS app 自动化测试 - 环境搭建

    1. 基本前提 安装好了 mac 上自动化测试的基本环境 如果没有,可以参考这一个: 2. iOS appium python自动化测试环境搭建 2.1 真机环境 2.1.1 前提:安装了 appiu ...

  3. kubectl get deploy

    for i in `kubectl get deployments.apps -n nvpc-apps-02|grep -v NAME|awk '{print $1}'`; do kubectl ge ...

  4. 【杂谈】Kafka的无锁设计

    前言 在分布式消息队列系统中,Kafka 的无锁设计是其高吞吐量和高并发的核心优势之一.通过避免锁的竞争,Kafka 能够在高并发和大规模的生产环境中保持高效的性能.为了更好地理解 Kafka 的无锁 ...

  5. Qt编写地图综合应用5-自适应拉伸

    一.前言 用过echart的人都会遇到一个问题,就算是代码中写了window.onresize = echart.resize,也只是横向自适应拉伸填充页面,垂直方向不会变化,除非指定高度才可以,这就 ...

  6. 企业微信的IM架构设计揭秘:消息模型、万人群、已读回执、消息撤回等

    本文作者潘唐磊,腾讯WXG(微信事业群)开发工程师,毕业于中山大学.内容有修订. 1.内容概述 本文总结了企业微信的IM消息系统架构设计,阐述了企业业务给IM架构设计带来的技术难点和挑战,以及技术方案 ...

  7. GMP大数库

    GMP大数库学习 了解 大数库 在网络安全技术领域中各种加密算法的软件实现始终有一个共同话题是如何在普通的PC机上实现大数运算.普通的PC机内部字长最多时32位或64位,但各种加密算法中为了达到一定安 ...

  8. Secure Face Matching Using Fully Homomorphic Encryption-2018:学习

    本文学习论文"Secure Face Matching Using Fully Homomorphic Encryption-2018"和"基于全同态加密的人脸特征密文认 ...

  9. OA系统的天数该怎样计算

    文章首发:https://blog.liuzijian.com/post/oa-system-count-days.html 在开发一些OA系统的过程中,经常能遇到一个问题,就是时长计算,比如请假有请 ...

  10. Slate文档编辑器-Node节点与Path路径映射

    Slate文档编辑器-Node节点与Path路径映射 在之前我们聊到了slate中的Decorator装饰器实现,装饰器可以为我们方便地在编辑器渲染调度时处理range的渲染,这在实现搜索替换.代码高 ...