php在header增加key,sign,timestamp,实现鉴权

2023-09-22 13:08:45

在PHP中,您可以通过在HTTP请求的Header中增加Key、Sign和Timestamp等信息来进行安全性鉴权。

以下是一种基本的思路和示例,用于说明如何实现这种鉴权机制:

  1. 生成Key和Sign: 服务端和客户端之间共享一个密钥(Key)。当客户端发起请求时,它需要使用密钥生成一个签名(Sign)。签名可以使用加密算法(例如HMAC-SHA256)来生成,将请求参数和时间戳(Timestamp)等信息与密钥结合起来计算得到。签名用于验证请求的完整性和来源。

  2. 添加Header信息: 客户端将生成的Sign和Timestamp以及Key添加到HTTP请求的Header中。通常,Key可以在每次请求中都包含在Header中,而Sign和Timestamp则需要针对每个请求进行计算。

  3. 服务端验证: 服务端接收到请求后,从Header中提取Key、Sign和Timestamp等信息。然后,服务端使用相同的密钥和相同的算法来计算请求的签名,并与客户端提供的签名进行比较。如果签名匹配且时间戳在合理范围内,则请求被视为有效,否则将被拒绝。

一个简化的示例,演示如何在PHP中实现这个过程:

客户端请求示例(使用 cURL):

<?php
$apiKey = 'your_api_key';
$apiSecret = 'your_api_secret';

// 构建请求数据
$data = [
    'param1' => 'value1',
    'param2' => 'value2',
];

// 生成时间戳
$timestamp = time();

// 生成签名
$signature = hash_hmac('sha256', json_encode($data) . $timestamp, $apiSecret);

// 发起HTTP请求,将Key、Sign和Timestamp添加到Header中
$ch = curl_init('https://example.com/api/endpoint');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, [
    'X-Api-Key: ' . $apiKey,
    'X-Api-Signature: ' . $signature,
    'X-Api-Timestamp: ' . $timestamp,
]);
curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($data));
$response = curl_exec($ch);
curl_close($ch);

echo $response;
?>

服务端验证示例:

<?php
$apiKey = 'your_api_key';
$apiSecret = 'your_api_secret';

// 获取请求中的Header信息
$headers = getallheaders();

if (
    isset($headers['X-Api-Key']) && 
    isset($headers['X-Api-Signature']) && 
    isset($headers['X-Api-Timestamp'])
) {
    $clientKey = $headers['X-Api-Key'];
    $clientSignature = $headers['X-Api-Signature'];
    $clientTimestamp = $headers['X-Api-Timestamp'];

    // 验证时间戳是否在合理范围内,以防止重放攻击
    $currentTime = time();
    if (abs($currentTime - $clientTimestamp) > 300) { // 设置合理的时间范围
        http_response_code(401);
        exit('Unauthorized - Timestamp is not valid.');
    }

    // 重新计算签名并与客户端提供的签名比较
    $data = file_get_contents('php://input');
    $serverSignature = hash_hmac('sha256', $data . $clientTimestamp, $apiSecret);

    if ($serverSignature === $clientSignature && $clientKey === $apiKey) {
        // 验证通过,处理请求
        echo 'Authentication successful!';
        // 在这里执行业务逻辑
    } else {
        http_response_code(401);
        exit('Unauthorized - Signature is not valid.');
    }
} else {
    http_response_code(401);
    exit('Unauthorized - Headers are missing.');
}
?>

这只是一个简单的示例,实际应用中需要更多的安全性和错误处理机制。鉴权过程应根据具体的安全需求和应用程序设计进行调整。此外,考虑使用HTTPS来加密通信以提高安全性。

更多推荐

Zookeeper集群 + Kafka集群

Zookeeper集群+Kafka集群Zookeeper概述Zookeeper定义*Zookeeper是一个开源的分布式的,为分布式框架提供协调服务的Apache项目。Zookeeper工作机制*****Zookeeper从设计模式角度来理解:是一个基于观察者模式设计的分布式服务管理框架,它负责存储和管理大家都关心的数

PY32F003F18之ADC问题

普然单片机PY32F003F18的内部有一个LDO,其电压固定为1.2V。我在用官方程序测试时,若接上USB转串口的RX导线,向PC发送数据,读内部参考电压比较正确,但是,当接上USB转串口的TX导线时,发现读到内部电压变成了3.3V。见下图:断开USB转串口的TX导线,数据又恢复正常了。用万用表测试该导线电压,为5V

最新中国各地区新能源汽车产量及123个公司公共充电桩数量数据(2015-2023)

数据简介:2010年,《国务院关于加快培育和发展战略性新兴产业的决定》将新能源汽车产业列为战略性新兴产业之一。9月5日,在工信部召开的重点行业稳增长新闻发布会上,工信部装备工业一司司长王卫明表示,今年1—7月,我国新能源汽车产销超过450万辆,同比增长超过40%,其中出口63.6万辆,同比增长1.5倍,成为我国经济的一

go并发(进程、线程、协程)

背景go强大的多线程能力很强大,能并发处理大量的任务。详细案例分类主要介绍go中的进程、线程、协程这三个东西。它们的关系按照内存大小的关系依次是进程>线程>协程(一般一个协程2K)。进程进程基本上是一个正在执行的程序,它是操作系统中最小的资源分配单位。比如电脑上运行的一个软件就是一个进程。go开启进程的方式有三种,本质

MySQL(2) Explain

1、概念使用EXPLAIN关键字可以模拟优化器执行SQL语句,分析你的查询语句或是结构的性能瓶颈2、使用在select语句之前增加explain关键字,MySQL会在查询上设置一个标记,执行查询会返回执行计划的信息,而不是执行这条SQL在explain语句后马上执行一条showwarnings语句,会展示mysql对上

Docker

前言:📕作者简介:热爱编程的小七,致力于C、Java、Python等多编程语言,热爱编程和长板的运动少年!📘相关专栏Java基础语法,JavaEE初阶,数据库,数据结构和算法系列等,大家有兴趣的可以看一看。😇😇😇有兴趣的话关注博主一起学习,一起进步吧!一、初识Docker1.1项目部署的问题大型项目组件较多,

Session,cookie,cache,memcache三者的详细讲解

1.SessionSession是一种在服务器端跟踪客户端状态的机制,主要用于在用户与服务器之间建立会话。当用户访问网站时,服务器会为该用户创建一个唯一的会话,并为其分配一个唯一的会话标识符(通常是一个长字符串),这个标识符存储在服务器上。之后,用户和服务器之间的所有交互都通过这个唯一的会话标识符进行标识,以保持状态的

基于时序分析及约束(1)-时序约束是什么?

首先回答标题的问题:时序约束是什么?简单来讲,时序约束就是你要告诉综合工具,你的标准是什么。综合工具应该如何根据你的标准来布线,以满足所以寄存器的时序要求。为什么要做时序约束?这里引用特权同学书中的话:“没有任何设计约束的工程,编译器工作的时候就如脱缰的野马,漫无目的且随意任性;但是,任何的设计过约束或者欠约束,都可能

打造本地紧密链接的开源社区——KCC@长沙开源读书会&openKylin爱好者沙龙圆满举办...

2023年9月9日,由开源社联合openKylin社区举办的KCC@长沙开源读书会&openKylin爱好者沙龙,在长沙圆满举办。这是KCC@长沙首次正式进入公众视野,开展开源交流活动,也是openKylin社区长沙首场线下沙龙。长沙地区及其周边的众多开源爱好者齐聚活动现场,聆听读书分享、参与开源话题讨论,实现1+1>

HAM高可用配置及故障切换

1.什么是MHAMHA(MasterHighAvailability)是一套优秀的MySQL高可用环境下故障切换和主从复制的软件。MHA的出现就是解决MySQL单点的问题。MySQL故障切换过程中,MHA能做到0-30秒内自动完成故障切换操作。MHA能在故障切换的过程中最大程度上保证数据的一致性,以达到真正意义上的高可

RK3588修改eth0和eth1,对调这两个网卡设备的名称

1、以太网卡的名称一般是ethX(X可以是0,1,2,3…),一般我们的设备只有一个网卡,并且一般也不会改变它的网卡名称,所以不需要关注此问题,但是有一些设备有两三个网卡,有时候我们需要eth0是指定的硬件网卡设备,此时我们就需要人为干预一下,修改一下网卡的名称,使其满足我们的使用场景。2、在rk平台,假如你的两个网卡

热文推荐