laravel API 鑑權javascript
這是一個 laravel 的 API 鑑權包, laravel-api-auth
採用密鑰加密的鑑權方式,只要客戶端不被反編譯從而泄露密鑰,該鑑權方式理論上來講是安全的(不考慮量子計算機的出現)。php
composer require 96qbhy/laravel-api-auth
註冊 ServiceProvider
:java
Qbhy\LaravelApiAuth\ServiceProvider::class,
laravel 5.5+ 版本不須要手動註冊android
發佈配置文件ios
php artisan vendor:publish --provider="Qbhy\LaravelApiAuth\ServiceProvider"
在 App\Http\Kernal
中註冊中間件laravel
protected $routeMiddleware = [ 'api_auth' => Qbhy\LaravelApiAuth\LaravelApiAuthMiddleware::class, // other ... ];
添加 role
git
php artisan api_auth
而後按照格式把 access_key
和 secret_key
添加到, config/api_auth.php
裏面的 roles
數組中。github
'roles' => [ '{access_key}' => [ 'name' => '{role_name}', // 角色名字,例如 android 'secret_key' => '{secret_key}', ], ],
自定義簽名方法 (可選)config/api_auth.php
中的 encrypting
能夠修改成自定義的簽名函數,該函數將傳入三個參數: 密鑰: $secret_key
、隨機字符串: $echostr
、時間戳: $timestamp
,返回簽名後的字符串。該函數默認爲:web
/** * @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 \Illuminate\Http\JsonResponse */ 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
前端的例子,其餘客戶端同理,生成簽名而且帶上指定參數便可正常請求。
經過自定義簽名方法和自定義校驗方法,能夠使用其餘加密方法進行簽名,例如哈希
等其餘加密算法。更多自定義能夠直接複製Qbhy\LaravelApiAuth\LaravelApiAuthMiddleware
中間件後自行修改 。有問題請開issue
。
96qbhy.com 96qbhy@gmail.com