您现在的位置是:首页 > 文章详情

阿里云微服务消息队列(MQTT For IoT)C# 获取Token示例Demo

日期:2019-11-27点击:1054

概述

微消息队列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

原文链接:https://yq.aliyun.com/articles/729746
关注公众号

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。

持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。

转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。

文章评论

共有0条评论来说两句吧...

文章二维码

扫描即可查看该文章

点击排行

推荐阅读

最新文章