摘要:鑒權(quán)這是一個(gè)的鑒權(quán)包,采用密鑰加密的鑒權(quán)方式,只要客戶端不被反編譯從而泄露密鑰,該鑒權(quán)方式理論上來說是安全的不考慮量子計(jì)算機(jī)的出現(xiàn)。簽名重復(fù),規(guī)定時(shí)間內(nèi)出現(xiàn)兩次或以上相同的簽名。
laravel-api-auth
laravel API 鑒權(quán)
這是一個(gè) laravel 的 API 鑒權(quán)包, laravel-api-auth 采用密鑰加密的鑒權(quán)方式,只要客戶端不被反編譯從而泄露密鑰,該鑒權(quán)方式理論上來說是安全的(不考慮量子計(jì)算機(jī)的出現(xiàn))。
安裝項(xiàng)目地址: github.com/96qbhy/laravel-api-auth
composer require 96qbhy/laravel-api-auth配置
注冊(cè) ServiceProvider:
QbhyLaravelApiAuthServiceProvider::class,
laravel 5.5+ 版本不需要手動(dòng)注冊(cè)
發(fā)布配置文件
php artisan vendor:publish --provider="QbhyLaravelApiAuthServiceProvider"
在 AppHttpKernal 中注冊(cè)中間件
protected $routeMiddleware = [ "api_auth" => QbhyLaravelApiAuthLaravelApiAuthMiddleware::class, // other ... ];
添加 role
php artisan api_auth
然后按照格式把 access_key 和 secret_key 添加到, config/api_auth.php 里面的 roles 數(shù)組中。
"roles" => [ "{access_key}" => [ "name" => "{role_name}", // 角色名字,例如 android "secret_key" => "{secret_key}", ], ],
自定義簽名方法 (可選)
config/api_auth.php 中的 encrypting 可以修改為自定義的簽名函數(shù),該函數(shù)將傳入三個(gè)參數(shù): 密鑰: $secret_key、隨機(jī)字符串: $echostr、時(shí)間戳: $timestamp,返回簽名后的字符串。該函數(shù)默認(rèn)為:
/** * @param $secret_key * @param $echostr * @param $timestamp * @return string */ function encrypting($secret_key, $echostr, $timestamp) { return md5($secret_key . $echostr . $timestamp); }
自定義簽名校驗(yàn)規(guī)則(可選)
config/api_auth.php 中的 rule 可以修改為自定義的校驗(yàn)函數(shù),該函數(shù)將傳入三個(gè)參數(shù): 密鑰: $secret_key、客戶端簽名: $signature、服務(wù)端簽名: $server_signature,必須返回布爾值。該函數(shù)默認(rèn)為:
/** * @param $secret_key * @param $signature * @param $server_signature * @return bool */ function rule($secret_key, $signature, $server_signature) { return $signature === $server_signature; }
自定義錯(cuò)誤處理(可選)
config/api_auth.php 中的 error_handler 可以修改為自定義的錯(cuò)誤處理函數(shù),該函數(shù)將傳入兩個(gè)參數(shù): 請(qǐng)求: $request、錯(cuò)誤碼: $code。該函數(shù)默認(rèn)為:
/** * @param Request $request * @param int $code * @return IlluminateHttpJsonResponse */ function error_handler($request, $code) { return response()->json([ "msg" => "Forbidden", "code" => $code ], 403); }
$code 可能是以下幾個(gè)值中的一個(gè):
LaravelApiAuthMiddleware::LACK_HEADER -> 缺少請(qǐng)求頭。
LaravelApiAuthMiddleware::ACCESS_KEY_ERROR -> access_key 錯(cuò)誤。
LaravelApiAuthMiddleware::SIGNATURE_ERROR -> 簽名錯(cuò)誤。
LaravelApiAuthMiddleware::SIGNATURE_LAPSE -> 簽名失效,客戶端簽名時(shí)間和服務(wù)端簽名時(shí)間差超過設(shè)置的 timeout 值。
LaravelApiAuthMiddleware::SIGNATURE_REPETITION -> 簽名重復(fù),規(guī)定時(shí)間內(nèi)出現(xiàn)兩次或以上相同的簽名。
使用 路由中Route::get("api/example", function(Request $request){ // $request->get("client_role"); // todo... })->middleware(["api_auth"]); or Route::group(["middleware"=>"api_auth"], function(){ // routes... });
前端通過驗(yàn)證后 $request 會(huì)添加一個(gè) client_role 字段,該字段為客戶端的角色名稱。
import axios from "axios"; const access_key = "{access_key}"; // 服務(wù)端生成的 access_key const secret_key = "{secret_key}"; // 服務(wù)端生成的 secret_key const timestamp = Date.parse(new Date()) / 1000; // 取時(shí)間戳 const echostr = "asldjaksdjlkjgqpojg64131321"; // 隨機(jī)字符串自行生成 function encrypting(secret_key, echostr, timestamp){ return md5(secret_key + echostr + timestamp); // md5 庫(kù)自行引入 } 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 前端的例子,其他客戶端同理,生成簽名并且?guī)现付▍?shù)即可正常請(qǐng)求。
通過自定義簽名方法和自定義校驗(yàn)方法,可以使用其他加密方法進(jìn)行簽名,例如 哈希 等其他加密算法。更多自定義可以直接復(fù)制 QbhyLaravelApiAuthLaravelApiAuthMiddleware 中間件后自行修改 。有問題請(qǐng)開 issue 。
96qbhy.com
96qbhy@gmail.com
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://www.ezyhdfw.cn/yun/26017.html
摘要:的安全性不好,攻擊者可以通過獲取本地進(jìn)行欺騙或者利用進(jìn)行攻擊。 好久沒寫博客了,因?yàn)樽罱疽笪覍W(xué)spring cloud ,早點(diǎn)將以前軟件遷移到新的架構(gòu)上。所以我那個(gè)拼命的學(xué)吶,總是圖快,很多關(guān)鍵的筆記沒有做好記錄,現(xiàn)在又遺忘了很多關(guān)鍵的技術(shù)點(diǎn),極其罪惡! 現(xiàn)在想一想,還是踏踏實(shí)實(shí)的走比較好。這不,今天我冒了個(gè)泡,來補(bǔ)一補(bǔ)前面我所學(xué)所忘的知識(shí)點(diǎn)。 想要解鎖更多新姿勢(shì)?請(qǐng)?jiān)L問我的博客...
摘要:整個(gè)流程圖在網(wǎng)上查了很多,但看到有人用前端做騰訊開放平臺(tái),生成簽名的,所以閑著就自己弄了一下。這樣就可以請(qǐng)求騰訊開放平臺(tái)上的。注意如果使用身份證接口,字段是的的時(shí)候,格式問題不需要前面。 整個(gè)流程圖 showImg(https://segmentfault.com/img/bVbrHpe?w=745&h=924); 在網(wǎng)上查了很多,但看到有人用javascript前端做騰訊AI開放平臺(tái)...
這是小程序開發(fā)第二篇,主要介紹如何上傳圖片到騰訊云,之所以選擇騰訊云,是因?yàn)轵v訊云免費(fèi)空間大? 準(zhǔn)備工作 上傳圖片主要是將圖片上傳到騰訊云對(duì)象存儲(chǔ)(COS)。 要使用對(duì)象存儲(chǔ) API,需要先執(zhí)行以下步驟: 購(gòu)買騰訊云對(duì)象存儲(chǔ)(COS)服務(wù) 在騰訊云 對(duì)象存儲(chǔ)控制臺(tái) 里創(chuàng)建一個(gè) Bucket 在控制臺(tái) 個(gè)人 API 密鑰 頁面里獲取 AppID、SecretID、SecretKey 內(nèi)容 編寫一個(gè)...
這是小程序開發(fā)第二篇,主要介紹如何上傳圖片到騰訊云,之所以選擇騰訊云,是因?yàn)轵v訊云免費(fèi)空間大? 準(zhǔn)備工作 上傳圖片主要是將圖片上傳到騰訊云對(duì)象存儲(chǔ)(COS)。 要使用對(duì)象存儲(chǔ) API,需要先執(zhí)行以下步驟: 購(gòu)買騰訊云對(duì)象存儲(chǔ)(COS)服務(wù) 在騰訊云 對(duì)象存儲(chǔ)控制臺(tái) 里創(chuàng)建一個(gè) Bucket 在控制臺(tái) 個(gè)人 API 密鑰 頁面里獲取 AppID、SecretID、SecretKey 內(nèi)容 編寫一個(gè)...
摘要:一般根據(jù)前兩步的數(shù)據(jù),再加上服務(wù)的的密鑰不要泄漏,最好周期性更換,通過加密算法生成。非對(duì)稱加密后的授權(quán)和鑒權(quán)流程用戶只需要與微服務(wù)交互,不用訪問授權(quán)中心,效率大大提高1)JWT簡(jiǎn)介JWT,全稱是Json Web Token, 是JSON風(fēng)格輕量級(jí)的授權(quán)和身份認(rèn)證規(guī)范,可實(shí)現(xiàn)無狀態(tài)、分布式的Web應(yīng)用授權(quán);官網(wǎng):https://jwt.io (JWT,生成Token加密字符串的一個(gè)標(biāo)準(zhǔn)或格式...
閱讀 1286·2021-11-25 09:43
閱讀 1653·2021-10-25 09:47
閱讀 2524·2019-08-30 13:46
閱讀 811·2019-08-29 13:45
閱讀 1335·2019-08-26 13:29
閱讀 3059·2019-08-23 15:30
閱讀 1168·2019-08-23 14:17
閱讀 1373·2019-08-23 13:43