在URL中實現簡易的WebAPI驗簽

本文主要介紹一種與微信公眾平臺對接方式類似的,為 AspNetCore 提供的一種簡易的 WebAPI 簽名驗證中間件。

本文相關源碼和案例已開源,地址:https://github.com/sangyuxiaowu/SignAuthorization

原理說明

簡易的 API url 簽名驗證中間件,通過簡單的url參數驗證請求是否合法。思路是按照微信公眾平臺的驗證消息的確來自微信服務器[1]的方式來實現的。

訪問 WebAPI 需要實現的 signature 簽名流程也一樣:

1.將token、timestamp、nonce三個參數進行字典序排序2.將三個參數字符串拼接成一個字符串進行sha1加密3.開發者獲得加密后的字符串可與 signature 對比

安裝使用

添加包

使用包管理工具

Install-Package Sang.AspNetCore.SignAuthorization

或者 .NET CLI

dotnet add package Sang.AspNetCore.SignAuthorization

啟用和配置

在?app.MapControllers();?前啟用這個中間件,并進行一些必要的配置。

app.UseSignAuthorization(opt => {opt.sToken = "you-api-token";
});

使用驗證方式

在需要簽名的地方添加?SignAuthorizeAttribute

Mini API:

app.MapGet("/weatherforecast", () =>
{// your code
}).WithMetadata(new SignAuthorizeAttribute());

或者:

[HttpGet]
[SignAuthorize]
public IEnumerable<WeatherForecast> Get()
{// your code
}

配置說明

參數default說明
UnauthorizedBack{"success":false,"status":10000,"msg":"Unauthorized"}驗證失敗后的 json 返回
sTokenSignAuthorizationMiddlewareAPI簽名使用的token
WithPathfalse簽名時需要包含請求的路徑,以 '/' 開頭
Expire5簽名過期時間(單位:秒)
nTimeStamptimestamp時間戳的GET參數名
nNoncenonce隨機數的GET參數名
nSignsignature簽名的GET參數名

對接訪問

PHP example

$sToken = "you-api-token";
$sReqTimeStamp = time();
$sReqNonce = getNonce();
$tmpArr = array($sToken, $sReqTimeStamp, $sReqNonce);
sort($tmpArr, SORT_STRING);
$sign = sha1(implode($tmpArr));
$url = "http://localhost:5177/weatherforecast?timestamp=$sReqTimeStamp&nonce=$sReqNonce&signature=$sign";
echo "$url\n";
echo file_get_contents($url);function getNonce(){$str = '1234567890abcdefghijklmnopqrstuvwxyz';$t1='';for($i=0;$i<30;$i++){$j=rand(0,35);$t1 .= $str[$j];}return $t1;
}

.Net example

var unixTimestamp = DateTimeOffset.Now.ToUnixTimeSeconds();
var sNonce = Guid.NewGuid().ToString();ArrayList AL = new ArrayList();
AL.Add("you-api-token");
AL.Add(unixTimestamp.ToString());
AL.Add(sNonce);
AL.Sort(StringComparer.Ordinal);var raw = string.Join("", AL.ToArray());
using System.Security.Cryptography.SHA1 sha1 = System.Security.Cryptography.SHA1.Create();
byte[] encry = sha1.ComputeHash(Encoding.UTF8.GetBytes(raw));
string sign = string.Join("", encry.Select(b => string.Format("{0:x2}", b)).ToArray()).ToLower();var client = new HttpClient();
string jsoninfo = await client.GetStringAsync($"http://localhost:5177/weatherforecast?timestamp={unixTimestamp}&nonce={sNonce}&signature={sign}");

使用案例

在開源倉庫中,提供了兩個 weatherforecast 的接入驗證樣例?TestWebMiniAPI?和?TestWebAPI,引入 nuget 包?Sang.AspNetCore.SignAuthorization?后,僅需要修改很少的部分就可以實現 API 訪問的 URL 驗簽。

487dfb39880abb2ae3827dbfcc626ee1.png
案例

References

[1]?驗證消息的確來自微信服務器:?https://developers.weixin.qq.com/doc/offiaccount/Basic_Information/Access_Overview.html#%E7%AC%AC%E4%BA%8C%E6%AD%A5%EF%BC%9A%E9%AA%8C%E8%AF%81%E6%B6%88%E6%81%AF%E7%9A%84%E7%A1%AE%E6%9D%A5%E8%87%AA%E5%BE%AE%E4%BF%A1%E6%9C%8D%E5%8A%A1%E5%99%A8

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/282447.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/282447.shtml
英文地址,請注明出處:http://en.pswp.cn/news/282447.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Redis -- Hash(哈希) [3]

Redis Hash 是一個string類型的field和value的 映射表 &#xff0c;hash特別適合用于存儲對象。 注 : Redis 中每個 hash 可以存儲 232 - 1 鍵值對&#xff08;40多億&#xff09;。 比如這樣:注:在此,首先推薦一款redis可視化工具 https://redisdesktop.com/download , 是非常…

HBuilder 打包流程

1.運行HBuilder---百度搜索HBuilder&#xff0c;官網下載安裝包&#xff0c;解壓&#xff0c;運行HBuilder.exe。注冊賬號&#xff0c;并登陸 2.新建app---在左邊右鍵&#xff0c;選擇新建APP&#xff0c;或者&#xff0c;點擊中間的新建app 3.在彈出的窗口&#xff0c;填入應用…

pandas所占內存釋放

df pd.read_csv(....) 要調用循環處理多個文件時&#xff0c;內存占用情況嚴重&#xff0c;如果互相之間不需要調用&#xff0c;可以直接del df 釋放內存

Python3——字典

Python 字典(Dictionary) 字典是另一種可變容器模型&#xff0c;且可存儲任意類型對象。 字典的每個鍵值(key>value)對用冒號(:)分割&#xff0c;每個對之間用逗號(,)分割&#xff0c;整個字典包括在花括號({})中 定義字典 d {} d {key1 : value1, key2 : value2 } d di…

科技以換皮為本:路遙工具箱 V4 版本發布

作為定位“開發輔助”的工具&#xff0c;我也一直在想如何讓工具更有效率。是更快的打開速度還是更豐富的功能&#xff1f;路遙工具箱 V3 版本的界面布局是偏 BS 后臺系統的風格&#xff1a;可折疊的樹形菜單用來拓寬用戶的操作區域&#xff0c;多標簽的功能布局讓軟件保持整潔…

myisam數據表根據frm文件恢復數據表

有時,我們重裝mysql時,可能忘記備份數據了, 只留下了之前的mysql下面的data文件夾里的數據, 這時我們應該如何去恢復數據表呢 如果直接將原來的data目錄導進現在的mysql,肯定是不行的,其實很簡單 我們常用的數據表結構有myisam和innodb,這兩種數據表恢復數據的方式是不一樣的,這…

本文主要總結關于mysql的優化(將會持續更新)

2019獨角獸企業重金招聘Python工程師標準>>> ON DUPLICATE KEY UPDATE 事件背景 在閱讀公司原來代碼的過程中&#xff0c;我發現了這樣一段代碼: $sql "INSERT INTO {$table} ({$fields}) VALUES " . $values; if (!empty($onDuplicate)) {$sql . ON DU…

CS Academy Gcd Rebuild

題目鏈接&#xff1a;https://csacademy.com/contest/archive/task/gcd-rebuild/statement/ 題目大意&#xff1a;給出一個N*M的矩陣&#xff0c;其中第i行j列表示gcd(a[i], b[j])&#xff0c;現在不知道數組a&#xff0c;b&#xff0c;給出這個矩陣&#xff0c;求a&#xff0c…

ASP.NET Core 在 IIS 下的兩種部署模式

KestrelServer最大的優勢體現在它的跨平臺的能力&#xff0c;如果ASP.NET CORE應用只需要部署在Windows環境下&#xff0c;IIS也是不錯的選擇。ASP.NET CORE應用針對IIS具有兩種部署模式&#xff0c;它們都依賴于一個IIS針對ASP.NET CORE Core的擴展模塊。一、ASP.NET CORE Cor…

navicat連接遠程mysql

環境介紹: 這里,我連接的是阿里云的服務器,自己搭的環境,用的是mysql 5.7一 首先第一步,需要進入遠程服務器的mysql,更改host訪問權限 然后,將root允許訪問的host 改為%(任何ip地址都可以訪問) 注: 原來是只允許本地訪問二 本地用navicat連接遠程mysql 1. 常規部分填寫2. SSH部…

2018-08-15期 HBase命令行使用案例

1、進入hbase命令行[roothadoop-server01 bin]# hbase shell2、命令行幫助COMMAND GROUPS:Group name: generalCommands: status, table_help, version, whoamiGroup name: ddlCommands: alter, alter_async, alter_status, create, describe, disable, disable_all, drop, dro…

面向對象五大設計原則

最近在看七牛云許式偉的架構課, 重溫了面向對象五大設計原則(SOLID)&#xff0c;扣理論文字找出處。&#xff08;當然許老板是不可能深聊這么低級的內容&#xff0c;&#x1f921;&#xff09;注意區分設計原則和設計模式。設計原則更為抽象和泛化&#xff1b;設計模式也是抽象…

python函數式編程-匿名函數

>>> map(lambda x: x * x, [1, 2, 3, 4, 5, 6, 7, 8, 9]) [1, 4, 9, 16, 25, 36, 49, 64, 81] 關鍵字lambda表示匿名函數&#xff0c;冒號前面的x表示函數參數。 匿名函數有個限制&#xff0c;就是只能有一個表達式&#xff0c;不用寫return&#xff0c;返回值就是該表…

bean初始化、注銷

關于在spring 容器初始化 bean 和銷毀前所做的操作定義方式有三種&#xff1a; 第一種&#xff1a;通過PostConstruct 和 PreDestroy 方法 實現初始化和銷毀bean之前進行的操作 第二種是&#xff1a;通過 在xml中定義init-method 和 destory-method方法 第三種是&#xff1a;…

谷歌F12調試公眾號時,讓鼠標顯示出來

yi 環境介紹: win10 , 谷歌瀏覽器yii 概述: 在項目中,需要調試公眾號,本地環境搭好之后,在谷歌瀏覽時,發現移動到公眾號區域,鼠標居然不見了,這讓我怎么操作?各種操作可謂是日了狗了,非常麻煩yiii 調試時鼠標不見的解決辦法: 網上各種說法眾說紛紜,這里,我給出本人認為最恰當簡…

利用bootstrap插件設置時間

$("#"id_rand" .shijian-input").each(function () { $(this).datetimepicker({ lang:"ch", //語言選擇中文 注&#xff1a;舊版本 新版方法&#xff1a;$.datetimepicker.setLocale(ch); format: "hh : ii", /…

C# 編寫的 64位操作系統 -MOOS

MOOSMOOS ( My Own Operating System )是一個使用.NET Native AOT技術編譯的C# 64位操作系統。項目地址&#xff1a;https://github.com/nifanfa/MOOS編譯關于編譯MOOS的信息&#xff0c;請閱讀 編譯維基頁面&#xff1a;https://github.com/nifanfa/MOOS/wiki/。編譯要求VMwar…

js獲取屏幕寬高和下拉加載更多

document.body.clientWidth > BODY對象寬度 document.body.clientHeight > BODY對象高度 document.documentElement.clientWidth > 可見區域寬度 document.documentElement.clientHeight > 可見區域高度 網頁可見區域寬&#xff1a; document.body.clientWid…

X5開發中buttongrounp對應contents組件切換時速度快點無效

官方提供的解決辦法是&#xff1a;http://docs.wex5.com/wex5-ui-question-list-2084/ 原文如下&#xff1a;【問題】buttongrounp中的button按鈕全是代碼動態生成&#xff0c;對應的contents中的content也是代碼動態生成。發現在快讀點擊button的時候&#xff0c;content就會死…

JAVA語言基礎-面向對象(IO:IO字符流、遞歸)

2019獨角獸企業重金招聘Python工程師標準>>> 21.01_IO流(字符流FileReader) 1.字符流是什么 字符流是可以直接讀寫字符的IO流字符流讀取字符, 就要先讀取到字節數據, 然后轉為字符. 如果要寫出字符, 需要把字符轉為字節再寫出.2.FileReader FileReader類的read()方法…