阿里云微服务消息队列(MQTT For IoT)C# 获取Token示例Demo
概述
微消息队列MQTT通过Token鉴权模式向MQTT客户端提供有时效性的临时访问权限。通过MQTT Token服务可以给本地账号系统管理的用户颁发临时的访问凭证,并限制访问权限,以实现对单一客户端,单一资源的细粒度权限控制。目前官方已经给出了Java获取Token的Demo,下面给出基于C#获取Token的实现,然后使用PostMan工具测试,用户可以基于PostMan工具生成其它语言获取Token的方法。
相关参考
1、API官方说明地址;
2、参考Java Demo;
C# Code实现
1、Nuget 安装:Newtonsoft,处理Json对象使用;
2、完整的Code Sample
using System; using System.Collections.Generic; using System.IO; using System.Net; using System.Security.Cryptography; using System.Text; using Newtonsoft.Json.Linq; namespace MQTTTokenDemo { class Program { static void Main(string[] args) { // 参数解释:https://help.aliyun.com/document_detail/54276.html?spm=a2c4g.11186623.6.572.632e2584wtKkVY string resources = "Demodd/AAA"; string instanceId = "post-cn-mp9********"; string accessKey = "********"; string secretkey = "********"; long expireTime = 10000000L; applyToken(resources, instanceId, accessKey, secretkey, expireTime); } /// <summary> /// 请求获取Token /// </summary> /// <param name="resources">资源名称,即 MQTT Topic,多个 Topic 以逗号(,)分隔</param> /// <param name="instanceId">MQTT 实例 ID,一定要和客户端实际使用的实例 ID 匹配</param> /// <param name="accessKey">当前请求使用的账号的 AccessKeyId</param> /// <param name="secretkey">当前请求使用的账号的 AccessSecretId</param> /// <param name="expireTime">Token 失效的毫秒时间戳</param> public static void applyToken(string resources, string instanceId, string accessKey, string secretkey, long expireTime) { string apiUrl = "https://mqauth.aliyuncs.com/token/apply"; Dictionary<string, string> paramDic = new Dictionary<string, string>(); paramDic.Add("resources", resources); paramDic.Add("actions", "R,W"); paramDic.Add("serviceName", "mq"); paramDic.Add("expireTime", (((DateTime.Now.ToUniversalTime().Ticks - 621355968000000000) / 10000) + expireTime).ToString()); paramDic.Add("instanceId", instanceId); string signature = doHttpSignature(paramDic, secretkey); paramDic.Add("proxyType", "MQTT"); paramDic.Add("accessKey", accessKey); paramDic.Add("signature", System.Web.HttpUtility.UrlEncode(signature)); // 注意:此处务必对求得的signature进行urlencode处理,否则可能会因为不同时间求取的signature中可能包含特殊字符而出现请求407报错 //Console.WriteLine(sendRequestToGetToken(apiUrl, paramDic)); JObject json = JObject.Parse(sendRequestToGetToken(apiUrl, paramDic)); Console.WriteLine("Token: " + json["tokenData"].ToString()); Console.ReadKey(); } /// <summary> /// 计算签名signature /// </summary> /// <param name="paramDic"> 参数字典 </param> /// <param name="secretKey"> accessSecret </param> /// <returns> 返回签名 </returns> public static string doHttpSignature(Dictionary<string, string> paramDic, string secretKey) { List<string> paramList = new List<string>(); foreach (KeyValuePair<string, string> kvp in paramDic) { paramList.Add(kvp.Key + "=" + kvp.Value); } paramList.Sort(); StringBuilder stringBuilder = new StringBuilder(); for (int i = 0; i < paramList.Count; i++) { if (i > 0) { stringBuilder.Append("&"); } stringBuilder.Append(paramList[i]); } HMACSHA1 hmacKey = new HMACSHA1(Encoding.UTF8.GetBytes(secretKey)); string signature = Convert.ToBase64String(hmacKey.ComputeHash(Encoding.UTF8.GetBytes(stringBuilder.ToString()))); return signature; } /// <summary> /// 发送请求以获取token /// </summary> /// <param name="url"> url </param> /// <param name="parameters"> 请求的参数 </param> /// <param name="encoding"> 请求参数的编码方式 </param> /// <returns> 返回响应结果 </returns> public static string sendRequestToGetToken(string url, Dictionary<string, string> parameters) { //设置请求接口 var request = (HttpWebRequest)WebRequest.Create(url); byte[] data = null; StringBuilder buffer = new StringBuilder(); // 设置请求参数 if (!(parameters == null || parameters.Count == 0)) { int i = 0; foreach (string key in parameters.Keys) { if (i > 0) { buffer.AppendFormat("&{0}={1}", key, parameters[key]); } else { buffer.AppendFormat("{0}={1}", key, parameters[key]); } i++; } } data = Encoding.UTF8.GetBytes(buffer.ToString()); //请求方式 request.Method = "POST"; //请求头参数设置 request.ContentType = "application/x-www-form-urlencoded"; request.ContentLength = data.Length; using (var stream = request.GetRequestStream()) { stream.Write(data, 0, data.Length); } WebResponse response; try { response = request.GetResponse(); } catch (WebException ex) { response = ex.Response; } //转字符串 string responseString = new StreamReader(response.GetResponseStream()).ReadToEnd(); return responseString; } } }
3、测试运行结果
Post Man工具使用
1、具体的测试参数可以在上面Code的parameters对象中获取
2、请求参数设置
3、一键生成其它语言Demo
注意: signature参数还是需要使用者基于自己的开发语言自行参考Java或C# Demo实现。
参考链接
lmq-demo
C# POST请求demo,contentType 格式:application/x-www-form-urlencoded
低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
解密 云HBase时序引擎OpenTSDB 优化技术
逝者如斯夫,不舍昼夜。 —— 孔子 时间如流水,一去不复返。自古不乏对时间流逝的感慨,而现代已经有很多技术记录流逝的过去。我们可以拍照,可以录像,当然还可以用时序数据库! 时序数据库是专门存放随着时间推移而不断变化的数据。近些年,随着IoT等概念的流行,时序数据库成为数据库一个相对独立的领域逐渐受到重视,广泛应用于物联网、监控系统、金融、医疗和零售等多种场景。 过去12个月时序数据库(Time Series DBMS)热度不断增长 那么云上的用户如何构建一个存储海量数据的时序数据库呢?笔者这里推荐使用 云HBase + OpenTSDB 方案。云HBase是使用阿里多年优化过的HBase内核版本,本文不作过多介绍,详情请看 产品主页。 OpenTSDB简介 OpenTSDB是一款基于HBase构建的时序数据库,它的数据存储完全交给HBase,本身没有任何数据存储。所有节点是对等的,所以部署起来其实是非常方便的。因为基于HBase,所以本身就具备了横向扩展,存储海量数据的能力。常见的部署模式有2种,一种分离部署,一种混合部署。 独立部署,即与多个业务共享一个HBase。适合时序业务较小,...
- 下一篇
区块链数据分析必备工具BlockETL
BlockETL软件包用于比特币区块链数据分析中的数据抽取/转换/加载(ETL),可以从原始的比特币区块文件中抽取区块与交易数据并加载入通用SQL数据库,以便于后续的数据分析处理,非常适合区块链数据分析相关的毕业设计或课题研究项目。BlockETL官方下载地址:http://sc.hubwiz.com/codebag/blocketl-java/。 1、软件包概述 BlockETL软件包的主要特性如下: 直接读取原始区块文件,抽取速度快 将原始区块和交易数据加载至SQL数据库,便于后续的区块链数据分析 支持多流水线并行处理,可自己控制并发流水线数量 结构设计清晰,代码便于扩展 BlockETL软件包采用Java开发,支持Windows、OSX和Linux等多种操作系统,当前版本1.0.0,主要类/接口及关系如下图所示: BlockETL软件包的目录组织及主要代码文件清单如下: 代码文件 说明 build.gradle Gradle根项目构建文件 settings.gradle Gradle根项目配置文件 blocketl/ blocketl库代码目录 blocketl/build.gr...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- MySQL8.0.19开启GTID主从同步CentOS8
- Hadoop3单机部署,实现最简伪集群
- CentOS8编译安装MySQL8.0.19
- CentOS7编译安装Cmake3.16.3,解决mysql等软件编译问题
- Windows10,CentOS7,CentOS8安装MongoDB4.0.16
- SpringBoot2整合MyBatis,连接MySql数据库做增删改查操作
- SpringBoot2整合Thymeleaf,官方推荐html解决方案
- Eclipse初始化配置,告别卡顿、闪退、编译时间过长
- Springboot2将连接池hikari替换为druid,体验最强大的数据库连接池
- Mario游戏-低调大师作品