在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.mzph.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;填入应用…

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…

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部…

面向对象五大设计原则

最近在看七牛云许式伟的架构课, 重温了面向对象五大设计原则(SOLID)&#xff0c;扣理论文字找出处。&#xff08;当然许老板是不可能深聊这么低级的内容&#xff0c;&#x1f921;&#xff09;注意区分设计原则和设计模式。设计原则更为抽象和泛化&#xff1b;设计模式也是抽象…

谷歌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…

JAVA语言基础-面向对象(IO:IO字符流、递归)

2019独角兽企业重金招聘Python工程师标准>>> 21.01_IO流(字符流FileReader) 1.字符流是什么 字符流是可以直接读写字符的IO流字符流读取字符, 就要先读取到字节数据, 然后转为字符. 如果要写出字符, 需要把字符转为字节再写出.2.FileReader FileReader类的read()方法…

windows下, nginx 提示错误 No input file specified

一 环境介绍: win10, LNMP 二 错误描述: 访问网站时,提示"No input file specified"错误. 排错阶段: 1. 查看nginx access日志 (access.log) 发现提示404 错误 2. 分析原因: 这时,在同目录下创建一个txt文件,访问就可以正常输出了 这说明 现在nginx 访问php 没…

Ubuntu20.04+docker+jenkins+飞书实现自动化发布

一、从0-1一点一滴实现如何本地提交代码到gitlab然后实现前后端自动发布1.更新apt包索引sudo apt-get update2.安装必备的软件包以允许apt通过https使用存储库sudo apt-get install ca-certificates curl gnupg lsb-release3.添加Docker官方版本的GPG密钥sudo mkdir -p /etc/ap…

一个Demo让你掌握Android所有控件

一个Demo让你掌握Android所有控件 原文:一个Demo让你掌握Android所有控件本文是转载收藏,侵删,出处:"安卓巴士" 下面给出实现各个组件的源代码&#xff1a; 1.下拉框实现--Spinner [java] view plaincopyprint?package com.cellcom; import java.util.ArrayList;…

九妹带你走向 架构师

迈向系统架构师编者按&#xff1a;系统架构师是许多程序员的梦想职业。今天的你也许已经掌握了各种开发工具&#xff0c;并且能够使用各种平台进行开发&#xff0c;但作为一个架构师的要求&#xff0c;也许还有很长的道路。邢波涛先生在LAMP架构上的造诣&#xff0c;让我邀请他…

WPF 使用 DrawingContext 绘制温度计

WPF 使用 DrawingContext 绘制温度计控件名&#xff1a;Thermometer作者&#xff1a; WPFDevelopersOrg原文链接&#xff1a; https://github.com/WPFDevelopersOrg/WPFDevelopers框架使用大于等于.NET40&#xff1b;Visual Studio 2022;项目使用 MIT 开源许可协议&#xff…

装win10系统

一、使用U盘介质安装win10系统&#xff08;官方方式&#xff09; 官方安装工具下载地址&#xff1a;https://www.microsoft.com/zh-cn/software-download/windows10 1、进入官方安装工具下载页面&#xff0c;点击立即下载工具&#xff0c;下载安装工具。2、下载完成后&#xff…

C#构造函数、操作符重载以及自定义类型转换

构造器 构造器&#xff08;构造函数&#xff09;是将类型的实例初始化的特殊方法。构造器可分为实例构造器和类型构造器&#xff0c;本节将详细介绍有关内容。 实例构造器 顾名思义&#xff0c;实例构造器的作用就是对类型的实例进行初始化。如果类没有显示定义任何构造器&…