本文主要介绍一种与微信公众平台对接方式类似的,为 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验签相关推荐

  1. php webapi验签,Asp.netCore3.0 WebApi从0到1手摸手教你写【5】增加接口参数签名验证...

    通过前几个教程的学习,对webapi的编写基本上就可以入门了,可以做项目了,今天我们再给接口加个参数签名认证,之前的接口相当于赤果果的暴露在了网络上,只要知道接口地址.接口调用方式和传参就可以畅所欲为 ...

  2. 支付宝支付成功异步回调验签以及注意事项(附源码)

    文章目录 1. 吐槽: 2. 要注意的点: 3. 导入方法(上代码) 1. 吐槽: 做微信支付的时候抽时间去看了支付宝支付,发现支付宝支付好简单,有官方给的SDK直接调用就OK,但是真正做起来才发现实 ...

  3. python 支付宝生活号激活开发者模式-验签和签

    python 支付宝生活号激活开发者模式-验签签名 不啰嗦,直接开始,首先介绍一下这里使用的环境. 主要环境介绍 1 python3.72 Django3.03 alipay-sdk-python3. ...

  4. 支付宝扫码验签实例php,PHP 支付宝支付,支付宝回调

    下载官方SDK:https://openhome.alipay.com/doc/sdkDownload.resource?sdkType=PHP 在支付宝所创建的应用中添加" 电脑网站支付. ...

  5. 支付宝APP支付-php后台签名以及验签

    签名和验签在APP端也是可以完成的,考虑到安全问题,签名和验签最好在服务端完成,支付宝官方建议也是这样的,所以php端需要把签名好的参数传给APP端.详细步骤见正文: 一. 下载php支付宝sdk h ...

  6. 【OP-TEE】 TA的签名与验签 基于optee 3.11

    TA的签名 以optee-os 3.11版本为例.在optee_os目录下,存放着签名的私钥和签名脚本. 工程目录/optee_os/keys/default_ta.pem 工程目录/optee_os ...

  7. php pfx加密,php基于sha1withRSA算法的签名和验签(pfx证书)

    在和第三方支付接口对接时经常会对数据进行签名和验签,sha1WithRSA也算是比较常用的一种签名加密算法.php开启openssl库后实现起来也算比较简单. 我在这里使用sha1withRSA算法来 ...

  8. 支付宝请求签名php,支付宝APP之php后台签名以及验签实现方法

    签名和验签在APP端也是可以完成的,考虑到安全问题,签名和验签最好在服务端完成,支付宝官方建议也是这样的,所以php端需要把签名好的参数传给APP端.详细步骤见正文: 一. 下载php支付宝sdk h ...

  9. 支付宝支付同步回调url中携带参数的两种方法

    我的个人博客:逐步前行STEP 1. 如果要传递的参数是my_data,可以先将该参数添加到回调的url上: $return_url = "http://abcdefg.com/return ...

最新文章

  1. 万能android调用webservice方法——参数类型不受限制
  2. linux命令之date
  3. 蓝桥杯java第七届决赛第三题--打靶
  4. GraphPad Prism 9 for Win版 Mac版 2021最新完美版下载 科学绘图
  5. 织梦网站上传服务器不显示图片,解决织梦后台登陆不显示验证码图片问题
  6. Spark-shell 脚本批量执行命令,命令行批量执行命令
  7. 统计csv词频_分词词频统计
  8. 面试官:Redis中的缓冲区了解吗
  9. linux下的vconfig配置_Linux系统下安装配置-OpenLDAP-phpLDAPadmin
  10. sap客户主数据bapi_【SD系列】SAP SD模块-创建供应商主数据BAPI
  11. Apache设置用户权限(2个域名。一个能访问全部文件,一个只能访问指定文件)...
  12. 3. IPSEC-XXX与SSL-XXX的使用场景与在等保中涉及的条款
  13. 【历史上的今天】12 月 21 日:Ruby 语言问世;玛雅预言世界末日;计算机先驱诞生日
  14. JAVA快递单号查询接口对接教程【快递鸟DEMO】
  15. Excel中随机生成数字,函数RANDBETWEEN()的使用
  16. Python实验、函数和代码复用
  17. python高斯噪声怎么去除_【OpenCV+Python】线性滤波amp;非线性滤波
  18. 程序员如何一句话教老板做事?“我先下班了,你可要加把劲啊”
  19. 第二十九讲 求方程组通解和特解的公式(矩阵指数)
  20. 小白兔—雪花-吕中琪

热门文章

  1. qt中在QLabel上显示图像并画矩形框。
  2. 解决IE浏览器低版本兼容性问题的最快方法
  3. 大话设计模式:模板方法模式
  4. scratch无奈的Jaime 电子学会图形化编程scratch等级考试一级真题和答案解析2021-9
  5. 编译原理(三)语法分析:3.二义性与二义性的消除
  6. ubuntu禁止指定软件包更新
  7. 有什么蓝牙耳机好用又不贵?适合学生党的平价蓝牙耳机推荐
  8. python利用浏览器执行js_浏览器如何执行JS
  9. 北京遇上西雅图之不二情书
  10. FailedScheduling 1 node(s) had taint {node-role.kubernetes.io/master: }, that the pod didn‘t tolerat