0

0

PHP开发:如何使用 JWT 进行身份认证和授权

王林

王林

发布时间:2023-06-14 16:14:51

|

2816人浏览过

|

来源于php中文网

原创

在现代的 web 应用程序开发中,安全已经成为了一个不可或缺的部分。在这方面,身份认证和授权是至关重要的,因为它们确保只有授权用户可以访问受保护的资源。有许多身份认证和授权机制可用,其中 jwt(json web token)是一种特别流行的机制,因为它简单、灵活、可扩展且安全。在这篇文章中,我们将探讨如何使用 php 和 jwt 进行身份认证和授权。

第一部分:JWT 基础

JSON Web Token(JWT)是一种通过网络安全地传输声明和身份验证信息的开放标准。它由三个部分组成:头部、载荷和签名。

头部包含算法和 token 类型信息。它的示例可能如下所示:

{
  "alg": "HS256",
  "typ": "JWT"
}

载荷包含需要传输的信息。例如,用户名、角色和其他有关用户信息。载荷的示例可能如下所示:

立即学习PHP免费学习笔记(深入)”;

{
  "sub": "1234567890",
  "name": "John Doe",
  "iat": 1516239022
}

签名是包含密钥的加密字符串,用于验证 JWT 是否有效。签名的示例可能如下所示:

HMACSHA256(
  base64UrlEncode(header) + "." +
  base64UrlEncode(claims),
  secret)

第二部分:使用 PHP 实现 JWT

为了使用 JWT 进行身份认证和授权,我们需要一个 PHP 类来生成和验证 JWT。让我们看一下一个简单的 PHP JWT 类的实现。

<?php

class JWT {
  private $header;
  private $payload;
  private $secret;

  public function __construct($header, $payload, $secret) {
    $this->header = $header;
    $this->payload = $payload;
    $this->secret = $secret;
  }

  public function encode() {
    $header = $this->base64UrlEncode(json_encode($this->header));
    $payload = $this->base64UrlEncode(json_encode($this->payload));
    $signature = $this->base64UrlEncode(hash_hmac('sha256', $header . '.' . $payload, $this->secret, true));
    return $header . '.' . $payload . '.' . $signature;
  }

  public function decode($jwt) {
    $parts = explode('.', $jwt);
    $header = json_decode($this->base64UrlDecode($parts[0]), true);
    $payload = json_decode($this->base64UrlDecode($parts[1]), true);
    $signature = $this->base64UrlDecode($parts[2]);
    $result = hash_hmac('sha256', $parts[0] . '.' . $parts[1], $this->secret, true);
    if (hash_equals($result, $signature)) {
      return $payload;
    } else {
      return null;
    }
  }

  private function base64UrlEncode($data) {
    return rtrim(strtr(base64_encode($data), '+/', '-_'), '=');
  }

  private function base64UrlDecode($data) {
    return base64_decode(str_pad(strtr($data, '-_', '+/'), strlen($data) % 4, '=', STR_PAD_RIGHT));
  }
}

在这个 PHP 类中,$header$payload$secret 存储了 JWT 的头部、载荷和密钥信息。encode() 方法使用 headerpayloadsecret 来生成 JWT 字符串。decode() 方法使用给定的 JWT 字符串和密钥来获取载荷信息。

base64UrlEncode()base64UrlDecode() 方法用于编码和解码 JWT 的头部和载荷。

Elser AI
Elser AI

一站式AI动漫、短剧生成平台

下载

第三部分:将 JWT 用于身份认证和授权

现在,我们已经了解了 JWT 的基础知识,并且有一个 PHP JWT 类用于生成和验证 JWT。那么,我们如何将 JWT 用于身份认证和授权呢?

首先,当用户登录时,可以使用 JWT 发送一个令牌来验证他们的身份。服务器将生成一个带有用户名和密码有效载荷的 JWT,并将其发送给客户端。客户端将在每个请求中将此令牌作为 Authorization 标头的 Bearer 认证方案进行发送。服务器将从标头中提取 JWT 并根据需要验证其有效性。

以下是一个示例 JWT 实现用于身份认证和授权:

<?php

// 使用 JWT 登录
function login($username, $password) {
  // 检查用户名和密码是否正确
  $is_valid = validate_user_credentials($username, $password);
  if (!$is_valid) {
    return null;
  }

  // 生成 JWT
  $header = array('alg' => 'HS256', 'typ' => 'JWT');
  $payload = array('sub' => $username);
  $jwt = new JWT($header, $payload, $GLOBALS['secret']);
  $token = $jwt->encode();

  // 返回 JWT
  return $token;
}

// 验证 JWT
function validate_token($jwt) {
  $jwt = new JWT($header, $payload, $GLOBALS['secret']);
  $payload = $jwt->decode($jwt);
  if ($payload == null) {
    return false;
  }

  // 验证成功
  return true;
}

// 保护资源
function protect_resource() {
  // 检查 JWT 是否有效
  $jwt = get_authorization_header();
  if (!validate_token($jwt)) {
    http_response_code(401);
    exit();
  }

  // 资源保护
  // ...
}

// 从标头获取 JWT
function get_authorization_header() {
  $headers = getallheaders();
  if (isset($headers['Authorization'])) {
    return $headers['Authorization'];
  }
  return null;
}

// 检查用户名和密码是否正确
function validate_user_credentials($username, $password) {
  // 验证用户名和密码
  // ...
  return true;
}

// 密钥
$GLOBALS['secret'] = "my-secret";

// 登录并获取 JWT
$token = login("username", "password");

// 将 JWT 添加到标头
$headers = array('Authorization: Bearer ' . $token);

// 保护资源
protect_resource($headers);

在这个示例中,login() 方法使用 JWT 类创建一个 JWT,并返回它以便客户端使用。validate_token() 方法可以验证 JWT 的有效性。如果 JWT 无效,将返回 false。

get_authorization_header() 方法从请求标头中提取 JWT。 protect_resource() 方法用于保护 Web 资源。如果 JWT 无效,该函数将引发 401 错误。

最后,在全局范围内定义了一个密钥,$GLOBALS ['secret'] ,它应该是一个长字符串。请注意,此密码是秘密密码,不应包含在您的代码库中。通常,该密钥会存储在环境变量中,并由运行 Web 服务器的操作系统管理。

结论

JWT 是一个非常简单、灵活、可扩展且安全的机制,可用于 Web 应用的身份认证和授权。在本文中,我们已经了解了 JWT 的基本原理,并且看到了一个示例 PHP 类,用于生成和验证 JWT。我们还看到了如何将 JWT 用于身份验证和授权。现在,您可以在自己的 Web 应用程序中尝试 JWT,以确保您的应用在安全性方面更可靠。

相关文章

PHP速学教程(入门到精通)
PHP速学教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

WorkBuddy
WorkBuddy

腾讯云推出的AI原生桌面智能体工作台

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
bootstrap安装教程
bootstrap安装教程

本专题整合了bootstrap安装相关教程,阅读专题下面的文章了解更多详细操作教程。

3

2026.03.18

bootstrap框架介绍
bootstrap框架介绍

本专题整合了bootstrap框架相关介绍,阅读专题下面的文章了解更多详细内容。

4

2026.03.18

vscode 格式化
vscode 格式化

本专题整合了vscode格式化相关内容,阅读专题下面的文章了解更多详细内容。

2

2026.03.18

vscode设置中文教程
vscode设置中文教程

本专题整合了vscode设置中文相关内容,阅读专题下面的文章了解更多详细教程。

0

2026.03.18

vscode更新教程合集
vscode更新教程合集

本专题整合了vscode更新相关内容,阅读专题下面的文章了解更多详细教程。

3

2026.03.18

Gemini网页版零基础入门:5分钟上手Gemini聊天指南
Gemini网页版零基础入门:5分钟上手Gemini聊天指南

本专题专为零基础用户打造,5分钟快速掌握Gemini网页版核心用法。从账号登录到界面布局,详解如何发起对话、优化提示词及利用多模态功能。通过实战案例,教你高效获取信息、创作内容与分析数据。无论学习还是工作,轻松开启AI辅助新时代,让Gemini成为你的得力智能助手。

9

2026.03.18

Python WebSocket实时通信与异步服务开发实践
Python WebSocket实时通信与异步服务开发实践

本专题聚焦 Python 在实时通信场景中的开发实践,系统讲解 WebSocket 协议原理、长连接管理、消息推送机制以及异步服务架构设计。内容包括客户端与服务端通信实现、连接稳定性优化、消息队列集成及高并发处理策略。通过完整案例,帮助开发者构建高效稳定的实时通信系统,适用于聊天应用、实时数据推送等场景。

8

2026.03.18

Java Spring Security权限控制与认证机制实战
Java Spring Security权限控制与认证机制实战

本专题围绕 Java 后端安全体系建设展开,重点讲解 Spring Security 在权限控制与认证机制中的应用实践。内容涵盖用户认证流程、权限模型设计、JWT 鉴权方案、OAuth2 集成以及接口安全防护策略。通过实际项目案例,帮助开发者构建安全可靠的后端认证体系,提升系统安全性与可扩展能力。

26

2026.03.18

抖漫入口地址合集
抖漫入口地址合集

本专题整合了抖漫入口地址相关合集,阅读专题下面的文章了解更多详细地址。

176

2026.03.17

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Laravel---API接口
Laravel---API接口

共7课时 | 0.7万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号