微信小程序如何访问带有Token安全认证的API
展开
微信小程序访问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)

//创建一个工具目录 tool

//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的更多相关文章
- 微信小程序把玩(三十四)Audio API
原文:微信小程序把玩(三十四)Audio API 没啥可值得太注意的地方 重要属性: 1. wx.getBackgroundAudioPlayerState(object) 获取播放状态 2.wx.p ...
- 微信小程序把玩(三十九)navigation API
原文:微信小程序把玩(三十九)navigation API 演示效果也看到了小程序也就提供这几个处理导航控制.值得注意的是只能同时导航五个页面 主要属性: 导航条一些方法 wx.setNavigati ...
- 微信小程序把玩(三十五)Video API
原文:微信小程序把玩(三十五)Video API 电脑端不能测试拍摄功能只能测试选择视频功能,好像只支持mp4格式,值得注意的是成功之后返回的临时文件路径是个列表tempFilePaths而不是tem ...
- 微信小程序把玩(三十六)Storage API
原文:微信小程序把玩(三十六)Storage API 其实这个存储在新建Demo的时候就已经用到了就是存储就是那个logs日志,数据存储主要分为同步和异步 异步存储方法: 存数据 wx.setStor ...
- 微信小程序把玩(三十二)Image API
原文:微信小程序把玩(三十二)Image API 选择图片时可设置图片是否是原图,图片来源.这用的也挺常见的,比如个人中心中设置头像,可以与wx.upLoadFile()API使用 主要方法: wx. ...
- 12.通过微信小程序端访问企查查(采集工商信息)
需要注意的问题: 一.1.微信端访问企查查小程序需要登录.2.访问抓包获取的url是有时效性的过一段时间就不能用了. http://xcx.qichacha.com/wxa/v1/base/getEn ...
- 微信小程序,天气预报(百度地图开放平台API)
小程序看似一种全新的东西,但好在基本上就是曾经HTML,CSS,JS的一个微变版本. 语法和之前一样.只是一些用法和名字(标签)发生了一些变化. 小程序主要就四种扩展名的文件:js,json,wxml ...
- 【云开发】10分钟零基础学会做一个快递查询微信小程序,快速掌握微信小程序开发技能(轮播图、API请求)
大家好,我叫小秃僧 这次分享的是10分钟零基础学会做一个快递查询微信小程序,快速掌握开发微信小程序技能. 这篇文章偏基础,特别适合还没有开发过微信小程序的童鞋,一些概念和逻辑我会讲细一点,尽可能用图说 ...
- 微信小程序语音识别服务搭建全过程解析(https api开放,支持新接口mp3录音、老接口silk录音)
silk v3(或新录音接口mp3)录音转olami语音识别和语义处理的api服务(ubuntu16.04服务器上实现) 重要的写在前面 重要事项一: 所有相关更新,我优先更新到我个人博客中,其它地方 ...
- 【微信小程序】开发实战 之 「数据缓存API」解析
每个小程序都可以有自己的本地缓存,可以通过 数据缓存的API 实现对本地缓存进行 设置.获取和清理.本地缓存最大为10M.localStorage是永久存储的,但我们不建议将关键信息都放在localS ...
随机推荐
- ae基于面要素生成柱状图
IFeatureLayer fl = axMapControl1.get_Layer(0) as IFeatureLayer; IGeoFeatureLayer pGeoFeatLyr = fl as ...
- 简化 ASP.NET Core 依赖注入(DI)注册-Scrutor
简化 ASP.NET Core 依赖注入(DI)注册-Scrutor Scrutor 是一个开源库,旨在简化 ASP.NET Core 应用程序中依赖注入(DI)的注册过程.通过自动扫描程序集中的类型 ...
- DOM元素高度获取踩坑
前情 最近在开发一个需求,需要做一个滚动列表展示当前中奖用户,但是列表每一项高度又不是固定的,每次滚动前需要先获取当前要滚动的块是多高才知道要滚动多少. 坑位 在开发这个滚动列表的时候发现滚着滚着就会 ...
- [OS] 计算机资源虚拟化技术
1 定义:计算机资源虚拟化 服务器虚拟化主要通过软件技术将物理服务器的硬件资源抽象化,创建多个独立的虚拟服务器环境. 2 虚拟化技术方向 以下是一些常见的服务器虚拟化方式和工具: 基于hypervis ...
- 使用 Autofac, MediatR 和 FluentValidator 构建松耦合 ASP.NET Core API 应用
使用 MediatR 和 FluentValidator 1. 创建示例文件夹 Sample 首先,创建示例文件夹 Sample. 2. 创建表示层项目 Web 在示例文件夹 Sample 中,使用标 ...
- 笔记-AM的正交解调法
1.AM的模拟调制过程 AM信号是一种振幅调制信号,其携带的信息保存在其信号的振幅中,通过改变载波的振幅来实现基带数据的传输. 其函数表达式如下: \[s(t) = (A + m(t))*cos( ...
- Spring源码阅读(一):使用IDEA搭建Spring5.0.x源码阅读环境
说明 Spring源码阅读环境配置如下: Spring 5.x版本 Gradle 4.8.1 JDK8 IDEA2020.1 win10 搭建步骤 1. 下载Spring源码 下载地址:Github链 ...
- Qt编写安防视频监控系统33-onvif云台控制
一.前言 云台控制也是onvif功能中最常用的,最常用的功能排第一的是拿到视频流地址,排第二的就是云台控制了,云台控制的含义就是对带云台的摄像机进行上下左右的移动,一般云台摄像机都是带有一个小电机,一 ...
- Log4net的使用教程
不怎么爱写日志,(就是比较懒),后来遇上bug了找不到问题,才决定好好使用日志 其实说实话,log4配置的那些东西记不太住,但也不需要记住什么.百度就有现成的,自己跟着网上配置好之后,稍微记录一下,为 ...
- WPF 记录鼠标、触摸多设备混合输入场景问题
本文记录在WPF应用中鼠标.触摸混合输入,鼠标事件抬起时不会有MouseUp事件触发的问题. 事件输入我们都知道有3类:鼠标.触摸.触笔,鼠标是windows系统出来就有的事件,后面加了触笔.触摸. ...