laravel-api-auth
laravel API 鑑權
這是一個 laravel 的 API 鑑權包, laravel-api-auth
採用金鑰加密的鑑權方式,只要客戶端不被反編譯從而洩露金鑰,該鑑權方式理論上來說是安全的(不考慮量子計算機的出現)。
安裝
composer require 96qbhy/laravel-api-auth
配置
-
註冊
ServiceProvider
:QbhyLaravelApiAuthServiceProvider::class,
laravel 5.5+ 版本不需要手動註冊
-
釋出配置檔案
php artisan vendor:publish --provider="QbhyLaravelApiAuthServiceProvider"
-
在
AppHttpKernal
中註冊中介軟體protected $routeMiddleware = [ `api_auth` => QbhyLaravelApiAuthLaravelApiAuthMiddleware::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
中的encrypting
可以修改為自定義的簽名函式,該函式將傳入三個引數: 金鑰:$secret_key
、隨機字串:$echostr
、時間戳:$timestamp
,返回簽名後的字串。該函式預設為:/** * @param $secret_key * @param $echostr * @param $timestamp * @return string */ function encrypting($secret_key, $echostr, $timestamp) { return md5($secret_key . $echostr . $timestamp); }
-
自定義簽名校驗規則(可選)
config/api_auth.php
中的rule
可以修改為自定義的校驗函式,該函式將傳入三個引數: 金鑰:$secret_key
、客戶端簽名:$signature
、服務端簽名:$server_signature
,必須返回布林值。該函式預設為:/** * @param $secret_key * @param $signature * @param $server_signature * @return bool */ function rule($secret_key, $signature, $server_signature) { return $signature === $server_signature; }
-
自定義錯誤處理(可選)
config/api_auth.php
中的error_handler
可以修改為自定義的錯誤處理函式,該函式將傳入兩個引數: 請求:$request
、錯誤碼:$code
。該函式預設為:/** * @param Request $request * @param int $code * @return IlluminateHttpJsonResponse */ function error_handler($request, $code) { return response()->json([ `msg` => `Forbidden`, `code` => $code ], 403); }
$code
可能是以下幾個值中的一個:-
LaravelApiAuthMiddleware::LACK_HEADER
-> 缺少請求頭。 -
LaravelApiAuthMiddleware::ACCESS_KEY_ERROR
->access_key
錯誤。 -
LaravelApiAuthMiddleware::SIGNATURE_ERROR
-> 簽名錯誤。 -
LaravelApiAuthMiddleware::SIGNATURE_LAPSE
-> 簽名失效,客戶端簽名時間和服務端簽名時間差超過設定的timeout
值。 -
LaravelApiAuthMiddleware::SIGNATURE_REPETITION
-> 簽名重複,規定時間內出現兩次或以上相同的簽名。
-
使用
路由中
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`;
const access_key = `{access_key}`; // 服務端生成的 access_key
const secret_key = `{secret_key}`; // 服務端生成的 secret_key
const timestamp = Date.parse(new Date()) / 1000; // 取時間戳
const echostr = `asldjaksdjlkjgqpojg64131321`; // 隨機字串自行生成
function encrypting(secret_key, echostr, timestamp){
return md5(secret_key + echostr + timestamp); // md5 庫自行引入
}
const requestConfig = {
headers: {
"api-signature": encrypting(secret_key, echostr, timestamp),
"api-echostr": echostr,
"api-timestamp": timestamp,
"api-access-key": access_key
}
};
axios.post(`/api/example`,{},requestConfig).then(res=>{
// todo
});
本例子為
web
前端的例子,其他客戶端同理,生成簽名並且帶上指定引數即可正常請求。
通過自定義簽名方法和自定義校驗方法,可以使用其他加密方法進行簽名,例如雜湊
等其他加密演算法。更多自定義可以直接複製QbhyLaravelApiAuthLaravelApiAuthMiddleware
中介軟體後自行修改 。有問題請開issue
。
96qbhy.com
96qbhy@gmail.com