laravel API 鉴权
这是一个 laravel 的 API 鉴权包, laravel-api-auth
采用 jwt token
的鉴权方式,只要客户端不被反编译从而泄露密钥,该鉴权方式理论上来说是安全的。
PS: web 前端 API 没有绝对的安全,该项目的本意是给不暴露源码的客户端提供一种鉴权方案(如 service、APP客户端)。
composer require 96qbhy/laravel-api-auth
注册 ServiceProvider
:
Qbhy\LaravelApiAuth\ServiceProvider::class,
laravel 5.5+ 版本不需要手动注册
发布配置文件
php artisan vendor:publish --provider="Qbhy\LaravelApiAuth\ServiceProvider"
在 App\Http\Kernal
中注册中间件
protected $routeMiddleware = [
'api_auth' => \Qbhy\LaravelApiAuth\Middleware::class,
// other ...
];
添加 role
php artisan api_auth
然后按照格式把 access_key
和 secret_key
添加到, config/api_auth.php
里面的 roles
数组中。
'roles' => [
'{access_key}' => [
'name' => '{role_name}', // 角色名字,例如 android
'secret_key' => '{secret_key}',
],
],
自定义签名方法 (可选)
config/api_auth.php
中的 signature_methods
可以添加自定义的签名类,该类需要继承自 Qbhy\LaravelApiAuth\Signatures\SignatureInterface
接口
<?php
/**
* User: 96qbhy
* Date: 2018/4/16
* Time: 下午3:22
*/
namespace Qbhy\LaravelApiAuth\Signatures;
class Md5 implements SignatureInterface
{
public static function sign(string $string, string $secret): string
{
return md5($string . $secret);
}
public static function check(string $string, string $secret, string $signature): bool
{
return static::sign($string, $secret) === $signature;
}
}
自定义错误处理
token 校验不通过的情况下会抛异常,请在 Handler
捕获后自行处理。
目前有三种异常 :
Route::get('api/example', function(Request $request){
// $request->get('client_role');
// todo...
})->middleware(['api_auth']);
\\ or
Route::group(['middleware'=>'api_auth'], function(){
// routes...
});
通过验证后
$request
会添加一个client_role
字段,该字段为客户端的角色名称。
import axios from 'axios';
import { Base64 } from 'js-base64';
const access_key = '{access_key}'; // 服务端生成的 access_key
const secret_key = '{secret_key}'; // 服务端生成的 secret_key
const timestamp = Date.parse(new Date()) / 1000; // 取时间戳
const echostr = 'asldjaksdjlkjgqpojg64131321'; // 随机字符串自行生成
const header = Base64.encode(JSON.stringify({
"alg": "md5",
"type": "jwt"
}));
const payload = Base64.encode(JSON.stringify({
"timestamp": timestamp,
"echostr": echostr,
"ak": access_key
}));
const signature_string = header + '.' + payload;
function md5Sign(string, secret){
return md5(string + secret); // md5 库自行引入
}
const api_token = signature_string + '.' + md5Sign(signature_string,secret_key);
const requestConfig = {
headers: {
"api-token": api_token
}
};
axios.post('/api/example',{},requestConfig).then(res=>{
// todo
});
本例子为
web
前端的例子,其他客户端同理,生成签名并且带上指定参数即可正常请求。 通过自定义签名方法和自定义校验方法,可以使用其他加密方法进行签名,例如哈希
等其他加密算法。
96qbhy.com
96qbhy@gmail.com