展开
微信小程序访问Token安全验证的API接口
API
//添加一个自定义过滤器
using Newtonsoft.Json;
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Web;
using System.Web.Http.Controllers;
using System.Web.Http.Filters;
using System.Web.Security;

namespace Web2
{
public class ApiSecretFilter : ActionFilterAttribute
{
//请求有效性验证
//合法请求为 带有 时间戳+随机数+数据(get/post)+数字签名(token)
//数字签名=时间戳+随机数+私钥+数据 进行md5加密后的字符串
public override void OnActionExecuting(HttpActionContext actionContext)
{
string staffid = "p889aabbc#@";
string timestamp = string.Empty, nonce = string.Empty, singture = string.Empty;
//消息头中的关键数据
if (actionContext.Request.Headers.Contains("timestamp"))
{
timestamp = actionContext.Request.Headers.GetValues("timestamp").FirstOrDefault();
}
if (actionContext.Request.Headers.Contains("nonce"))
{
nonce = actionContext.Request.Headers.GetValues("nonce").FirstOrDefault();
}
if (actionContext.Request.Headers.Contains("singture"))
{
singture = actionContext.Request.Headers.GetValues("singture").FirstOrDefault();
}
if (string.IsNullOrEmpty(timestamp) || string.IsNullOrEmpty(nonce) || string.IsNullOrEmpty(singture))
{
throw new Exception("必要参数缺失");
}
//http://localhost:9080/api/values?name=张三&age=18 --> name张三age18

var method = actionContext.Request.Method.Method;
IDictionary<string, string> sortedParams = null;
switch (method.ToUpper())
{
case "POST":
case "DELETE":
case "PUT":
Stream stream = HttpContext.Current.Request.InputStream;
StreamReader reader = new StreamReader(stream);
sortedParams = new SortedDictionary<string, string>(new JsonSerializer().Deserialize<Dictionary<string, string>>(new JsonTextReader(reader)));
break;
case "GET":
IDictionary<string, string> paramters = new Dictionary<string, string>();
foreach (string item in HttpContext.Current.Request.QueryString)
{
if (!string.IsNullOrEmpty(item))
{
paramters.Add(item, HttpContext.Current.Request.QueryString[item]);
}
}
sortedParams = new SortedDictionary<string, string>(paramters);
break;

default:
break;
}
var data = string.Empty;//请求参数
StringBuilder query = new StringBuilder();
if (sortedParams != null)
{
foreach (var sort in sortedParams.OrderBy(o => o.Key))
{
if (!string.IsNullOrEmpty(sort.Key))
{
query.Append(sort.Key).Append(sort.Value);
}
}
data = query.ToString().Replace(" ", "");
}
//生产签名并和客户端传递的签名对比
var md5 = FormsAuthentication.HashPasswordForStoringInConfigFile(timestamp + nonce + staffid + data, "MD5").ToLower();

if (!md5.Equals(singture.ToLower()))
{
throw new Exception("无权访问");
}

}
}
}
//找到APP_Start文件下的WebApiConfig类进行添加路由
public static void Register(HttpConfiguration config)
{
// Web API 配置和服务
config.Filters.Add(new ApiSecretFilter());
// Web API 路由
config.MapHttpAttributeRoutes();

config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{id}",
defaults: new { id = RouteParameter.Optional }
);
}
 
微信小程序
//创建一个MD5目录 MD5 用来加密信息(网上下载一个MD5.js)
![如图所示](https://img-blog.csdnimg.cn/20190409145605944.png)
//创建一个工具目录 tool
![如图所示](https://img-blog.csdnimg.cn/20190409145645356.png)
//tool.js里面代码段
var mds=require('../MD5/MD5.js')
function GetNonce()
{
return Math.ceil(Math.random()*1000)
}
//时间戳,APi签名,数据,随机数
function Md5(timestamp,staffid,data,nonce)
{
let d=dictionaryOrderWithData(data);
return mds.MD5(timestamp+staffid+d+nonce);
}
function dictionaryOrderWithData(dic)
{
var result="";
var sdic=Object.keys(dic).sort(function(a,b){return a.localeCompare(b)});
var value="";
for(var ki in sdic)
{
if(dic[sdic[ki]]==null)
{
value=""
}
else
{
value=dic[sdic[ki]];
}
result+=sdic[ki]+value;
}
return result.replace(/\s/g,"");
}
module.exports={
Nonce:GetNonce,
MD5:Md5
}
//然后在你请求API的代码段之前
//时间戳
let timestamp = Date.parse(new Date());
//随机数
let nonce = tool.Nonce().toString();
//请求数据
let data = { name: app.globalData.userInfo.nickName, iv: e.detail.iv, encryptedData: e.detail.encryptedData, code: app.globalData.code };
//API定义的签名
let staffid = "p889aabbc#@";
//进行加密
let md5=tool.MD5(timestamp,staffid,data,nonce);
wx.request({
//请求路径
url: server +'api/LibraryManage/AddWcReader',
method:"post",
header:{
timestamp: timestamp,
nonce: nonce,
singture:md5
},
data: data,
success:function(res){
console.log("请求成功");
}

https://blog.csdn.net/cc_mydream/article/details/89149463

微信小程序如何访问带有Token安全认证的API的更多相关文章

  1. 微信小程序把玩(三十四)Audio API

    原文:微信小程序把玩(三十四)Audio API 没啥可值得太注意的地方 重要属性: 1. wx.getBackgroundAudioPlayerState(object) 获取播放状态 2.wx.p ...

  2. 微信小程序把玩(三十九)navigation API

    原文:微信小程序把玩(三十九)navigation API 演示效果也看到了小程序也就提供这几个处理导航控制.值得注意的是只能同时导航五个页面 主要属性: 导航条一些方法 wx.setNavigati ...

  3. 微信小程序把玩(三十五)Video API

    原文:微信小程序把玩(三十五)Video API 电脑端不能测试拍摄功能只能测试选择视频功能,好像只支持mp4格式,值得注意的是成功之后返回的临时文件路径是个列表tempFilePaths而不是tem ...

  4. 微信小程序把玩(三十六)Storage API

    原文:微信小程序把玩(三十六)Storage API 其实这个存储在新建Demo的时候就已经用到了就是存储就是那个logs日志,数据存储主要分为同步和异步 异步存储方法: 存数据 wx.setStor ...

  5. 微信小程序把玩(三十二)Image API

    原文:微信小程序把玩(三十二)Image API 选择图片时可设置图片是否是原图,图片来源.这用的也挺常见的,比如个人中心中设置头像,可以与wx.upLoadFile()API使用 主要方法: wx. ...

  6. 12.通过微信小程序端访问企查查(采集工商信息)

    需要注意的问题: 一.1.微信端访问企查查小程序需要登录.2.访问抓包获取的url是有时效性的过一段时间就不能用了. http://xcx.qichacha.com/wxa/v1/base/getEn ...

  7. 微信小程序,天气预报(百度地图开放平台API)

    小程序看似一种全新的东西,但好在基本上就是曾经HTML,CSS,JS的一个微变版本. 语法和之前一样.只是一些用法和名字(标签)发生了一些变化. 小程序主要就四种扩展名的文件:js,json,wxml ...

  8. 【云开发】10分钟零基础学会做一个快递查询微信小程序,快速掌握微信小程序开发技能(轮播图、API请求)

    大家好,我叫小秃僧 这次分享的是10分钟零基础学会做一个快递查询微信小程序,快速掌握开发微信小程序技能. 这篇文章偏基础,特别适合还没有开发过微信小程序的童鞋,一些概念和逻辑我会讲细一点,尽可能用图说 ...

  9. 微信小程序语音识别服务搭建全过程解析(https api开放,支持新接口mp3录音、老接口silk录音)

    silk v3(或新录音接口mp3)录音转olami语音识别和语义处理的api服务(ubuntu16.04服务器上实现) 重要的写在前面 重要事项一: 所有相关更新,我优先更新到我个人博客中,其它地方 ...

  10. 【微信小程序】开发实战 之 「数据缓存API」解析

    每个小程序都可以有自己的本地缓存,可以通过 数据缓存的API 实现对本地缓存进行 设置.获取和清理.本地缓存最大为10M.localStorage是永久存储的,但我们不建议将关键信息都放在localS ...

随机推荐

  1. OS之《CPU调度》

    CPU调度层次 高级调度:是作业调度.将外村的作业加载到内存里,分配对应的资源,然后加入就绪队列 低级调度:将就绪队列中的进程调度到CPU执行 中级调度:为了提高内存的利用率和系统的吞吐量,将暂时不能 ...

  2. 在 Windows 上运行 Podman: 操作指南

    在 Windows 上运行 Podman: 操作指南 https://www.redhat.com/sysadmin/run-podman-windows 2021 年 9 月的时候,我写过一篇关于如 ...

  3. 企架布道:中电金信应邀出席2023佛山敏捷之旅暨DevOps Meetup

    近日,2023佛山敏捷之旅暨DevOps Meetup活动顺利举行,本次活动以助力大湾区金融和互联网企业敏捷DevOps实施和效能提升为主题,共设立 2个会场,16个话题分享,200余位金融.互联网企 ...

  4. 【Python】【Matplotlib】词云图

    关于从网页获取文本 import requests from bs4 import BeautifulSoup code = requests.request("post",&qu ...

  5. Qt编写物联网管理平台35-实时曲线

    一.前言 设备采集到的数据,通过曲线展示也是一种非常好的方式,尽管之前已经有了表格数据展示.设备面板展示.设备地图展示等,实时曲线也是一种不错的方式,这个用户自由选择,反正通过端口已经拿到了所有要采集 ...

  6. Qt编写安防视频监控系统57-子模块1设备列表

    一.前言 近期在经历过这次UI大重构以后,很多拆分的功能都以单独的模块的形式出现,以悬停窗体的形式嵌入或者悬浮在主窗体中,这种方式极大的增强了系统的拓展性,客户想要什么模块就开启什么模块,放置到合适的 ...

  7. Datawhale 2025冬令营第二弹!!😊自己微调模型!

    Datawhale AI冬令营(第一期) 垂类大模型构建 定制垂类大模型 = 优质数据集 + 开源大模型 整理者:博客园-岁月月宝贝!!! 姓名:HeYang 特别鸣谢Datawhale!!!:htt ...

  8. MySql中MySqlParameter的用法

    在C#中,向表person插入一条数据(表person包括两列:id和name),使用MySqlParameter定义表中各列的值. static void Main(string[] args) { ...

  9. 阿里IM技术分享(五):闲鱼亿级IM消息系统的及时性优化实践

    本文由阿里闲鱼技术团队有攸分享,原题"向消息延迟说bybye:闲鱼消息及时到达方案",有修订和改动,感谢作者的分享. 1.引言 IM消息作为闲鱼用户重要的交易咨询工具,核心目标有两 ...

  10. clip-retrieval检索本地数据集

    clip-retrieval检索本地数据集 from clip_retrieval.clip_client import ClipClient, Modality from tqdm import t ...