前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >在URL中实现简易的WebAPI验签

在URL中实现简易的WebAPI验签

作者头像
桑榆肖物
发布2022-11-18 10:11:06
发布2022-11-18 10:11:06
1.1K00
代码可运行
举报
文章被收录于专栏:桑榆肖物桑榆肖物
运行总次数:0
代码可运行

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

原理说明

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

访问 WebAPI 需要实现的 signature 签名流程也一样:

1.将token、timestamp、nonce三个参数进行字典序排序2.将三个参数字符串拼接成一个字符串进行sha1加密3.开发者获得加密后的字符串可与 signature 对比

安装使用

添加包

使用包管理工具

代码语言:javascript
代码运行次数:0
运行
复制
Install-Package Sang.AspNetCore.SignAuthorization

或者 .NET CLI

代码语言:javascript
代码运行次数:0
运行
复制
dotnet add package Sang.AspNetCore.SignAuthorization

启用和配置

app.MapControllers(); 前启用这个中间件,并进行一些必要的配置。

代码语言:javascript
代码运行次数:0
运行
复制
app.UseSignAuthorization(opt => {
    opt.sToken = "you-api-token";
});

使用验证方式

在需要签名的地方添加 SignAuthorizeAttribute

Mini API:

代码语言:javascript
代码运行次数:0
运行
复制
app.MapGet("/weatherforecast", () =>
{
    // your code
}).WithMetadata(new SignAuthorizeAttribute());

或者:

代码语言:javascript
代码运行次数:0
运行
复制
[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

代码语言:javascript
代码运行次数:0
运行
复制
$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

代码语言:javascript
代码运行次数:0
运行
复制
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 验签。

案例

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

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2022-09-27,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 桑榆肖物 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 原理说明
  • 安装使用
    • 添加包
    • 启用和配置
    • 使用验证方式
  • 配置说明
  • 对接访问
    • PHP example
    • .Net example
  • 使用案例
    • References
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档