1.背景介绍
目前,在Web开发中,API的使用越来越普遍,而很多API需要进行认证和授权才能使用。本文主要介绍如何使用PHP开发实现百度文心一言API接口的权限管理和认证方式。
2.什么是百度文心一言API接口
百度文心一言是一个短语生成器,能够根据提供的主题生成相应的短语,或者随机生成一组句子,供用户参考。百度文心一言提供了API接口,可以通过HTTP请求来获取随机的短语。
2.1 API接口的请求方式
通过HTTP请求来获取随机的短语。
$url = "https://api.lwl12.com/hitokoto/v1?encode=json&charset=utf-8";
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$response = curl_exec($ch);
curl_close($ch);
$result = json_decode($response, true);
echo $result['hitokoto'];
2.2 API接口的认证方式
百度文心一言API接口需要认证,才能够使用。具体认证方式如下:
将AccessKey和SecretKey拼接成一个字符串:
$AccessKey = 'your_access_key';
$SecretKey = 'your_secret_key';
$content = $AccessKey.$SecretKey;
使用SHA256算法对该字符串进行加密:
$signature = hash('sha256', $content, true);
将加密后的字符串进行Base64编码,并将编码后的字符串作为Header中的Authorization参数值进行传输:
$headers = array(
'Content-type: application/json',
'Authorization: Basic '.base64_encode($signature),
);
3.如何实现API接口的权限管理和认证方式
下面是实现API接口的权限管理和认证方式的基本步骤:
在数据库中创建一个用户表,并存储用户的AccessKey和SecretKey;
为API接口添加认证授权功能,只有有合法的AccessKey和SecretKey才能够访问API接口;
为API接口添加限流功能,控制API接口的请求速度,避免被滥用。
3.1 用户表设计
用户表的设计如下:
CREATE TABLE IF NOT EXISTS `users` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`access_key` varchar(100) NOT NULL,
`secret_key` varchar(100) NOT NULL,
`created_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8mb4;
其中,id是用户表的主键,access_key是AccessKey,secret_key是SecretKey,created_at是创建时间。
3.2 认证授权功能实现
下面是认证授权功能的实现代码:
//获取请求头信息
$headers = apache_request_headers();
$authHeader = isset($headers['Authorization']) ? $headers['Authorization'] : '';
if (!$authHeader) {
header('HTTP/1.1 401 Unauthorized');
header('WWW-Authenticate: Basic realm="API Authentication"');
exit();
}
$authHeaderDecoded = base64_decode(substr($authHeader, 6));
$authHeaderParts = explode(':', $authHeaderDecoded);
$accessKey = $authHeaderParts[0];
$secretKey = $authHeaderParts[1];
//查询用户信息
$sql = "select * from users where access_key=:access_key";
$stmt = $pdo->prepare($sql);
$stmt->bindValue(':access_key', $accessKey);
$stmt->execute();
$user = $stmt->fetch(PDO::FETCH_ASSOC);
//验证SecretKey
$content = $accessKey.$user['secret_key'];
$signature = hash('sha256', $content, true);
if (base64_encode($signature) !== $secretKey) {
header('HTTP/1.1 401 Unauthorized');
exit();
}
首先,通过apache_request_headers()获取请求头信息,从中取出Authorization参数。然后解码Authorization参数,获得AccessKey和SecretKey,查询数据库,找到相应的用户信息。接着,将AccessKey和SecretKey拼接为一个字符串,使用SHA256算法进行加密。最后,将加密后的结果进行Base64编码,与传入的SecretKey进行比较,如果一致,代表认证授权成功,否则认证授权失败。
3.3 限流功能实现
下面是限流功能的实现代码:
//限流
$rateLimiting = new RateLimiting();
$rateLimiting->setOption('interval', 60);
$rateLimiting->setOption('limit', 10);
if (!$rateLimiting->check($accessKey)) {
header('HTTP/1.1 429 Too Many Requests');
exit();
}
首先,创建一个RateLimiting实例,设置限流的间隔时间为1分钟,最大请求次数为10次。然后,调用check方法,检查当前AccessKey的访问次数是否超过限制。如果超过限制,返回429 Too Many Requests错误。
4.总结
通过本文的介绍,我们了解了如何使用PHP开发实现百度文心一言API接口的权限管理和认证方式。具体实现步骤包括:创建用户表,为API接口添加认证授权功能,为API接口添加限流功能。