API 鑑權新姿式 - 簽名鑑權

laravel-api-auth

laravel API 鑑權javascript

這是一個 laravel 的 API 鑑權包, laravel-api-auth 採用密鑰加密的鑑權方式,只要客戶端不被反編譯從而泄露密鑰,該鑑權方式理論上來講是安全的(不考慮量子計算機的出現)。php

項目地址: github.com/96qbhy/laravel-api-auth前端

安裝

composer require 96qbhy/laravel-api-auth

配置

  1. 註冊 ServiceProvider:java

    Qbhy\LaravelApiAuth\ServiceProvider::class,

    laravel 5.5+ 版本不須要手動註冊android

  2. 發佈配置文件ios

    php artisan vendor:publish --provider="Qbhy\LaravelApiAuth\ServiceProvider"
  3. App\Http\Kernal 中註冊中間件laravel

    protected $routeMiddleware = [
        'api_auth' => Qbhy\LaravelApiAuth\LaravelApiAuthMiddleware::class,
        // other ...
    ];
  4. 添加 rolegit

    php artisan api_auth

    而後按照格式把 access_keysecret_key 添加到, config/api_auth.php 裏面的 roles 數組中。github

    'roles' => [
        '{access_key}' => [
            'name' => '{role_name}',        // 角色名字,例如 android
            'secret_key' => '{secret_key}',
        ],
    ],
  5. 自定義簽名方法 (可選)
    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);
    }
  6. 自定義簽名校驗規則(可選)
    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;
    }
  7. 自定義錯誤處理(可選)
    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

相關文章
相關標籤/搜索