在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 返回 |
sToken | SignAuthorizationMiddleware | API签名使用的token |
WithPath | false | 签名时需要包含请求的路径,以 '/' 开头 |
Expire | 5 | 签名过期时间(单位:秒) |
nTimeStamp | timestamp | 时间戳的GET参数名 |
nNonce | nonce | 随机数的GET参数名 |
nSign | signature | 签名的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 验签。
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
在URL中实现简易的WebAPI验签相关推荐
- php webapi验签,Asp.netCore3.0 WebApi从0到1手摸手教你写【5】增加接口参数签名验证...
通过前几个教程的学习,对webapi的编写基本上就可以入门了,可以做项目了,今天我们再给接口加个参数签名认证,之前的接口相当于赤果果的暴露在了网络上,只要知道接口地址.接口调用方式和传参就可以畅所欲为 ...
- 支付宝支付成功异步回调验签以及注意事项(附源码)
文章目录 1. 吐槽: 2. 要注意的点: 3. 导入方法(上代码) 1. 吐槽: 做微信支付的时候抽时间去看了支付宝支付,发现支付宝支付好简单,有官方给的SDK直接调用就OK,但是真正做起来才发现实 ...
- python 支付宝生活号激活开发者模式-验签和签
python 支付宝生活号激活开发者模式-验签签名 不啰嗦,直接开始,首先介绍一下这里使用的环境. 主要环境介绍 1 python3.72 Django3.03 alipay-sdk-python3. ...
- 支付宝扫码验签实例php,PHP 支付宝支付,支付宝回调
下载官方SDK:https://openhome.alipay.com/doc/sdkDownload.resource?sdkType=PHP 在支付宝所创建的应用中添加" 电脑网站支付. ...
- 支付宝APP支付-php后台签名以及验签
签名和验签在APP端也是可以完成的,考虑到安全问题,签名和验签最好在服务端完成,支付宝官方建议也是这样的,所以php端需要把签名好的参数传给APP端.详细步骤见正文: 一. 下载php支付宝sdk h ...
- 【OP-TEE】 TA的签名与验签 基于optee 3.11
TA的签名 以optee-os 3.11版本为例.在optee_os目录下,存放着签名的私钥和签名脚本. 工程目录/optee_os/keys/default_ta.pem 工程目录/optee_os ...
- php pfx加密,php基于sha1withRSA算法的签名和验签(pfx证书)
在和第三方支付接口对接时经常会对数据进行签名和验签,sha1WithRSA也算是比较常用的一种签名加密算法.php开启openssl库后实现起来也算比较简单. 我在这里使用sha1withRSA算法来 ...
- 支付宝请求签名php,支付宝APP之php后台签名以及验签实现方法
签名和验签在APP端也是可以完成的,考虑到安全问题,签名和验签最好在服务端完成,支付宝官方建议也是这样的,所以php端需要把签名好的参数传给APP端.详细步骤见正文: 一. 下载php支付宝sdk h ...
- 支付宝支付同步回调url中携带参数的两种方法
我的个人博客:逐步前行STEP 1. 如果要传递的参数是my_data,可以先将该参数添加到回调的url上: $return_url = "http://abcdefg.com/return ...
最新文章
- 万能android调用webservice方法——参数类型不受限制
- linux命令之date
- 蓝桥杯java第七届决赛第三题--打靶
- GraphPad Prism 9 for Win版 Mac版 2021最新完美版下载 科学绘图
- 织梦网站上传服务器不显示图片,解决织梦后台登陆不显示验证码图片问题
- Spark-shell 脚本批量执行命令,命令行批量执行命令
- 统计csv词频_分词词频统计
- 面试官:Redis中的缓冲区了解吗
- linux下的vconfig配置_Linux系统下安装配置-OpenLDAP-phpLDAPadmin
- sap客户主数据bapi_【SD系列】SAP SD模块-创建供应商主数据BAPI
- Apache设置用户权限(2个域名。一个能访问全部文件,一个只能访问指定文件)...
- 3. IPSEC-XXX与SSL-XXX的使用场景与在等保中涉及的条款
- 【历史上的今天】12 月 21 日:Ruby 语言问世;玛雅预言世界末日;计算机先驱诞生日
- JAVA快递单号查询接口对接教程【快递鸟DEMO】
- Excel中随机生成数字,函数RANDBETWEEN()的使用
- Python实验、函数和代码复用
- python高斯噪声怎么去除_【OpenCV+Python】线性滤波amp;非线性滤波
- 程序员如何一句话教老板做事?“我先下班了,你可要加把劲啊”
- 第二十九讲 求方程组通解和特解的公式(矩阵指数)
- 小白兔—雪花-吕中琪
热门文章
- qt中在QLabel上显示图像并画矩形框。
- 解决IE浏览器低版本兼容性问题的最快方法
- 大话设计模式:模板方法模式
- scratch无奈的Jaime 电子学会图形化编程scratch等级考试一级真题和答案解析2021-9
- 编译原理(三)语法分析:3.二义性与二义性的消除
- ubuntu禁止指定软件包更新
- 有什么蓝牙耳机好用又不贵?适合学生党的平价蓝牙耳机推荐
- python利用浏览器执行js_浏览器如何执行JS
- 北京遇上西雅图之不二情书
- FailedScheduling 1 node(s) had taint {node-role.kubernetes.io/master: }, that the pod didn‘t tolerat