在URL中实现简易的WebAPI验签

简介: 本文主要介绍一种与微信公众平台对接方式类似的,为 AspNetCore 提供的一种简易的 WebAPI 签名验证中间件。
本文相关源码和案例已开源,地址: https://github.com/sangyuxiaowu/SignAuthorization

原理说明

简易的 API url 签名验证中间件,通过简单的url参数验证请求是否合法。思路是按照微信公众平台的验证消息的确来自微信服务器的方式来实现的。

访问 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 的接入验证样例 TestWebMiniAPITestWebAPI,引入 nuget 包 Sang.AspNetCore.SignAuthorization 后,仅需要修改很少的部分就可以实现 API 访问的 URL 验签。

案例

相关文章
WebApi获取请求url主机
Url.Request.Headers.Host学习交流群:364976091
1174 0
跟据URL来实现WebService
 [WebMethod]        public string GetResults(string word)        {            string resultHtml = string.
566 0
|
JSON 编解码 数据格式
httpclient的几种请求URL的方式
一、httpclient项目有两种使用方式。一种是commons项目,这一个就只更新到3.1版本了。现在挪到了HttpComponents子项目下了,这里重点讲解HttpComponents下面的httpclient的使用方式。
1472 0
|
Java
springboot 接收post、get、重定向,并从url中获取参数
springboot 接收post、get、重定向,并从url中获取参数
983 0
一个配置解决 Shiro 登录 URL 中带 JSESSIONID 的问题
一个配置解决 Shiro 登录 URL 中带 JSESSIONID 的问题
2883 0
|
PHP Apache 数据格式
thinkphp URL规则、URL伪静态、URL路由、URL重写、URL生成(十五)
原文: thinkphp URL规则、URL伪静态、URL路由、URL重写、URL生成(十五) 本章节:详细介绍thinkphp URL规则、URL伪静态、URL路由、URL重写、URL生成 一、URL规则1、默认是区分大小写的 2、如果我们不...
1513 0
|
前端开发 JavaScript 网络协议
HTTP初识,fiddler的使用,URL各部分介绍,QueryString
HTTP初识,fiddler的使用,URL各部分介绍,QueryString
Shiro登录成功之后跳到指定URL
通常我们使用shiro,登录之后就会跳到我们上一次访问的URL,如果我们是直接访问登录页面的话,shiro就会根据我们配置的successUrl去重定向,如果我们没有配置successUrl的话,那么shiro重定向默认的/,这个逻辑看shiro的源码就可以知道: 1.
1582 0

热门文章

最新文章