var http = require('http');
var url = require("url");
var crypto = require("crypto");
var port = 18080; function sha1(str){
var md5sum = crypto.createHash("sha1");
md5sum.update(str);
str = md5sum.digest("hex");
return str;
} function validateToken(req,res){
var query = url.parse(req.url,true).query;
//console.log("*** URL:" + req.url);
//console.log(query);
var signature = query.signature;
var echostr = query.echostr;
var timestamp = query['timestamp'];
var nonce = query.nonce;
var oriArray = new Array();
oriArray[0] = nonce;
oriArray[1] = timestamp;
oriArray[2] = "token";//这里是你在微信开发者中心页面里填的token,而不是****
oriArray.sort();
var original = oriArray.join('');
console.log("Original str : " + original);
console.log("Signature : " + signature );
var scyptoString = sha1(original);
if(signature == scyptoString){
res.end(echostr);
console.log("Confirm and send echo back");
}else {
res.end("false");
console.log("Failed!");
}
} var webSvr = http.createServer(validateToken);
webSvr.listen(port,function(){
console.log("Start validate");
});

与PHP的源码有异曲同工之处;

 private function checkSignature()
{
$signature = $_GET["signature"];
$timestamp = $_GET["timestamp"];
$nonce = $_GET["nonce"]; $token = TOKEN;
$tmpArr = array($token, $timestamp, $nonce);
sort($tmpArr, SORT_STRING);
$tmpStr = implode( $tmpArr );
$tmpStr = sha1( $tmpStr ); if( $tmpStr == $signature ){
return true;
}else{
return false;
}
}

再看小新写的nodejs版本;

 var http = require('http');
var crypto = require('crypto'); var server = http.createServer(); server.on('request',function (req, res){
res.writeHead(200, {'Content-Type': 'text/plain'}); var signature = require('url').parse(req.url,true).query.signature
var timestamp = require('url').parse(req.url,true).query.timestamp
var echostr = require('url').parse(req.url,true).query.echostr
var nonce = require('url').parse(req.url,true).query.nonce
var token = 'Token';
var tmpArr = Array(token, timestamp, nonce).sort().join("");
var sha1 = crypto.createHash('sha1');
sha1.update(tmpArr);
tmpArr = sha1.digest('hex');
if(tmpArr == signature){
res.end(echostr);
}else{
res.end('404');
} }); server.listen(8088);

大体思路就是接受微信服务器发来的请求;

拆分参数;将参数排序、拼接、加密,与参数其中之一比对;

成功返回其中参数之一;

失败false;

微信token认证方法原理的更多相关文章

  1. 微信token验证失败的几种情况

    最近在研究用PHP做微信开发的时候,“修改配置时”,总是遇到token验证失败的提示.历经一番查找,种种输出日志和echo,发现,如果不echo调试信息,也不写日志,就不需要ob_clean(),如果 ...

  2. OAuth认证协议原理分析及同步消息到Twitter和Facebook使用方法

    OAuth有什么用?为什么要使用OAuth? twitter或豆瓣用户一定会发现,有时候,在别的网站,点登录后转到 twitter登录,之后转回原网站,你会发现你已经登录此网站了,这种网站就是这个效果 ...

  3. 基于Token认证的多点登录和WebApi保护

    在文章中有错误的地方,或是有建议或意见的地方,请大家多多指正,邮箱: linjie.rd@gmail.com 一天张三,李四,王五,赵六去动物园,张三没买票,李四制作了个假票,王五买了票,赵六要直接F ...

  4. Java实现基于token认证

    随着互联网的不断发展,技术的迭代也非常之快.我们的用户认证也从刚开始的用户名密码转变到基于cookie的session认证,然而到了今天,这种认证已经不能满足与我们的业务需求了(分布式,微服务).我们 ...

  5. token的工作原理及其功能

    一.前言 登录模块是我们在前端项目中一定会有的模块,模块中有一个重要的部分是用户登录验证,对于验证用户是否登录过,我们直接处理办法是检查缓存中是否存在token值,若存在则用户可直接登录,反之,用户需 ...

  6. 42.JSON Web Token认证

    JSON Web Token认证介绍 简称JWT认证,一般用于用户认证 JWT是一种相当新的标准,可用于基于token的身份验证 与内置的TokenAuthentication方案不同,JWT不需要使 ...

  7. 【翻译】asp.net core2.0中的token认证

    原文地址:https://developer.okta.com/blog/2018/03/23/token-authentication-aspnetcore-complete-guide token ...

  8. flask token认证

    在前后端分离的项目中,我们现在多半会使用token认证机制实现登录权限验证. token通常会给一个过期时间,这样即使token泄露了,危害期也只是在有效时间内,超过这个有效时间,token过期了,就 ...

  9. laravel5.7 前后端分离开发 实现基于API请求的token认证

    最近在学习前后端分离开发,发现 在laravel中实现前后台分离是无法无法使用 CSRF Token 认证的.因为 web 请求的用户认证是通过Session和客户端Cookie的实现的,而前后端分离 ...

随机推荐

  1. Oracle EBS-SQL (INV-2):检查帐户别名发放记录.sql

    SELECT FU.description                 操作者,         ITM.SEGMENT1               物料编码,         ITM.DESC ...

  2. xlslib库使用简记

    xlslib库使用简记 1 前言 最近需要使用C++结合xlslib库来生成Excel文件,但发现这个库的文档还真难找,找来找去发现唯一的线索是有一个test/目录里面的几个例子而已. 想到以后要不断 ...

  3. paip.c++ qt 共享库dll的建立

    paip.c++ qt 共享库dll的建立 作者Attilax ,  EMAIL:1466519819@qq.com  来源:attilax的专栏 地址:http://blog.csdn.net/at ...

  4. LeetCode-001 Two Sum

    [题目] Given an array of integers, find two numbers such that they add up to a specific target number. ...

  5. 使用trim方法检测用户输入

    首先需要封装trim方法,可以去除字符串两端空格的方法 function trim(str) { return str.replace(/^\s+|\s+$/g, ""); } 获 ...

  6. 使用sqlcmd执行连接的时候一直报有语法错误

    1.今天在使用sqlcmd进行执行连接操作的时候一直报有语法错误找了半天. 命令 sqlcmd -S 服务器名称 -U 帐户 -P 密码 示例 sqlcmd -S "LOCALHOST&qu ...

  7. 图片上传webuploader

    /** * 基于jquery的图片上传控件 */!function ($) { "use strict"; //定义上传事件 var upImgEvent = { fileQueu ...

  8. SQLServer 中实现类似MySQL中的group_concat函数的功能

    SQLServer中没有MySQL中的group_concat函数,可以把分组的数据连接在一起. 后在网上查找,找到了可以实现此功能的方法,特此记录下. SELECT a, stuff((SELECT ...

  9. 解决ie6支持最大高度最小高度的方法

    1.IE6支持max-height解决方法 IE6支持最大高度解决CSS代码:.yangshi{max-height:1000px;_height:expression((document.docum ...

  10. Android Studio git ignore

    # Built application files *.apk *.ap_ # Files for the Dalvik VM *.dex # Java class files *.class # G ...