php base64数据读出来后失效_PHP和NodeJS实现OneNET MQTTs Token校验

本文介绍了如何使用PHP和NodeJS实现OneNET MQTTs的Token校验,包括res参数说明、PHP和NodeJS的代码实现。内容涵盖了OneNET的MQTT物联网套件功能和鉴权验证的必要性。
摘要由CSDN通过智能技术生成

e36ad21f559ff1fcd2485eafb3b3284b.png

一晃一年多没有做 OneNET 的相关开发了,最早做过 OneNET 的 MQTT 接入。自从上次用 OneNET 做机房环监后一直稳定运行,也没有继续拓展。

最近又需要对接 OneNET 做一个小项目了,故需要重新学习一下 OneNET,现在看了一下 OneNET 对接入能力进行了整合,原来的 EDP、MQTT、HTTP 协议的设备接入并入了多协议接入,在原 MQTT 协议的基础上,新增了 MQTT 物联网套件,不仅支持设备接入、数据存储、设备管理、设备命令,还支持了设备状态同步、消息分发、规则引擎等功能。

目前 MQTTs 使用 Token 进行鉴权验证,官网上提供了 Python 和 Java 两种语言的算法实现,本文提供了 NodeJS 和 PHP 两种语言的算法实现。

MQTT 物联网套件-Token 算法

res 参数说明

我们预期的 res 是一个字符串,以下是 res 资源格式说明(摘自 OneNET 文档):

c46b6885e2e9fa342376d06ff7f9174f.png

PHP 实现

PHP 版本:PHP 7.x

/**
 * @name: getToken
 * @msg: MQTTs安全鉴权Token
 * @param {string} res
 * @param {string} accessKey
 * @return: string
 */
function getToken($res, $access_key)
{
    $version = '2018-10-31';
    $et = time() + 3600; // 过期时间:一小时后token失效
    $method = 'md5';
    $key = base64_decode($access_key);
    $org = $et . "n" . $method . "n" . $res . "n" . $version;
    // 签名
    $sign_b = hash_hmac($method, $org, $key, true);
    $sign = base64_encode($sign_b);
    $sign = urlencode($sign);
    $res = urlencode($res);
    $token = 'version=' . $version . '&res=' . $res . '&et=' . $et . '&method=' . $method . '&sign=' . $sign;

    return $token;
}

NodeJS 实现

NodeJS 版本:NodeJS 8.9

const CryptoJS = require('crypto-js');
const urlencode = require('urlencode');

/**
 * @name: getToken
 * @msg: OneNET MQTTs Token 算法
 * @param {*} res
 * @param {*} access_key
 * @return: token
 */
function getToken(res, access_key) {
  var version = "2018-10-31"; // 参数组版本号
  var et = String(parseInt(Date.now() / 1000) + 3600); // 访问过期时间 expirationTime (有效期为1小时)
  var method = "md5";
  // 对access_key进行base64解码
  var key = CryptoJS.enc.Base64.parse(access_key);
  // 计算sign
  var org = et + "n" + method + "n" + res + "n" + version;
  var sign_b = CryptoJS.HmacMD5(org, key);
  // 签名
  var sign = CryptoJS.enc.Base64.stringify(sign_b);
  // url 编码
  sign = urlencode(sign);
  res = urlencode(res);
  // 拼接token
  var token = "version=" + version + "&res=" + res + "&et=" + et + "&method=" + method + "&sign=" + sign;
  return token;
}

如果需要更改 method 加密方法,CryptoJS.Hmac 语句也需要同步修改,对应关系见下表。

c74667151d4e0f7fc35c3a4fe7cbf125.png

作者: 小谈谈

链接: https://www.txisfine.cn/archives/2e410137.html

来源: 弹霄博科 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值