微信小程序如何访问带有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 ...
随机推荐
- Vue2 面试题 (2023-09-22更新)
基础 Vue2.0 兼容 ie 哪个版本? 不支持 ie8,部分兼容 ie9,完全兼容 ie10 因为 vue 的响应式原理是基于 es5 的 Object.defineProperty 这个方法不支 ...
- Java性能最后一个领域:去除垃圾回收器
Java性能最后一个领域:去除垃圾回收器 不产生垃圾不等于不创建对象,如果对象创建满足以下几个条件,仍然可以在创建对象之后不需要垃圾回收器: 应用程序或者库在初始化的时候生成有限个数的对象,然后不断复 ...
- TB交易开拓者_趋势跟踪策略_多品种对冲_递进优化回测_A0001188020期货量化策略
如果您需要代写技术指标公式, 请联系我. 龙哥QQ:591438821 龙哥微信:Long622889 也可以把您的通达信,文华技术指标改成TB交易开拓者的自动交易量化策略. 众所周知,投资界有基本面 ...
- 如何控制bean的加载顺序?
写在前面 springboot遵从约定大于配置的原则,极大程度的解决了配置繁琐的问题.在此基础上,又提供了spi机制,用spring.factories可以完成一个小组件的自动装配功能. 在一般业务场 ...
- Qt视频监控系统一个诡异问题的解决思路(做梦都想不到)
一.前言 由于Qt版本众多,几百个版本之间存在不兼容的情况,为此如果要兼容很多版本,没有取巧的办法和特殊的捷径,必须自己亲自安装各个版本编译运行并测试,大问题一般不会有,除非缺少模块,小问题还是不断有 ...
- Qt编写物联网管理平台46-云端数据同步
一.前言 在上一篇文章说的采集数据转发的基础上,针对方案一还做了云端数据同步功能,满足各式各样的用户需求.云端数据库同步,相当于把本地采集到的数据实时存储到云端,至于这些记录到了云端后什么用途,客户端 ...
- Qt开发经验小技巧221-225
在对表格数据模型操作的时候,经常遇到一种场景就是,删除某条记录后,希望重新选中某一行.QTableView.QTableWidget本身就支持多选全选等操作,比如批量删除可以多选. //拿到表格数据模 ...
- Qt音视频开发42-人脸识别客户端
一.前言 人脸识别客户端程序,不需要和人脸识别相关的库在一起,而是通过协议通信来和人脸识别服务端通信交互,人脸识别客户端和服务端程序框架,主要是为了提供一套通用的框架,按照定好的协议,实现人脸识别的相 ...
- JavaScript中find()和 filter()方法的区别小结
前言 JavaScript 在 ES6 上有很多数组方法,每种方法都有独特的用途和好处. 在开发应用程序时,大多使用数组方法来获取特定的值列表并获取单个或多个匹配项. 在列出这两种方法的区别之前,我们 ...
- 开源即时通讯IM框架MobileIMSDK的微信小程序端开发快速入门
一.理论知识准备 您需要对微信小程序开发有所了解: 1)真正零基础入门学习笔记系列 2)从零开始的微信小程序入门教程 3)最全教程:微信小程序开发入门详解 您需要对WebSocket技术有所了解: 1 ...