应用鉴权,即Web应用的Token鉴权。开启后,只有使用Token加签的访问者才允许访问应用。本文介绍如何配置应用鉴权。

Token指系统颁发给应用的随机码,作用类似于安全证书。使用Token信息进行签名,可以让系统快速核验访问者身份,保证安全性。

使用Web可视化工作台开发的应用,默认访问时不会进行安全验证。为保证安全,如信息安全、设备控制保护等,可以开启Token鉴权。将Web应用嵌入到第三方网站或应用(如Web后台、移动App等)的场景下,建议开启。

开启应用鉴权

  1. 物联网平台控制台左侧导航栏,选择开发服务 > IoT Studio
  2. IoT Studio页的项目管理下,找到应用所属项目,单击项目对应的进入按钮。
  3. 在项目页,选择Web可视化开发
  4. Web可视化开发页的应用列表中,找到应用,单击应用对应的打开按钮。
  5. 在Web可视化应用编辑器左侧导航栏,单击设置
  6. 在应用的基本信息页签下,勾选Token验证前的复选框。

  7. 在确认弹窗中,单击开启Token

    开启Token后,系统会为该应用自动生成Token,单击查看图标即可显示。

  8. 集成应用的访问地址URL。

    开启Token后,用户便不能通过原来的URL直接访问您的应用页面。您需要在URL中集成Token加签信息。

    1. 将当前时间(毫秒)转化为字符串。
    2. 使用Token,通过 HMAC-SHA256 base64 对上一步得到的字符串进行加密。
      说明 为保证应用的安全性,计算出来的签名(signature)有效期为32个小时。32小时之后,需要重新计算新的签名(signature)。
    3. 将时间和加密得到的签名分别命名为time和signature,并放入到URL的querystring中。
    4. 测试。使用含有Token加签的URL访问应用。

    以下是集成访问地址的代码示例。

    • PHP示例代码:
      <?php
        $token = "54cc8224a92ddda750600157e17b****";
        $time = time()*1000;
        $stringToSign = strval($time);
        $signature = urlencode(base64_encode(hash_hmac('sha256', $stringToSign, $token, true)));
        $url = "http://${应用访问地址}"."?time=".$time."&signature=".$signature;
      ?>
      <iframe width=100% height=100% src="<?=$url?>"/>
    • Node.js示例代码:
      const crypto = require('crypto');
      var token = "54cc8224a92ddda750600157e17b****";
      var time = Date.now();
      var stringToSign = time.toString();
      var signature = crypto.createHmac('sha256', token).update(stringToSign).digest().toString('base64');
      var url="http://${应用访问地址}"+"?time="+time+"&signature="+ encodeURIComponent(signature);
    • Java示例代码:
      package com.company;
      import java.security.*;
      import java.util.Date;
      import javax.crypto.*;
      import javax.crypto.spec.SecretKeySpec;
      import org.apache.commons.codec.binary.Base64;
      import java.net.URLEncoder;
      
      /**
       * Created by studio on 2019/4/3.
       */
      public class TokenTest {
          public static String getSignedUrl(String token){
              Date date = new Date();
              Long time = date.getTime();
              String stringToSign = String.valueOf(time);
              String signature = HMACSHA256(stringToSign.getBytes(), token.getBytes());
              String url = "http://${应用访问地址}"+"?time="+time+"&signature="+ signature;
              return url;
          }
      
          /**
           * 利用Java原生的摘要实现SHA256加密
           * @param str 加密后的报文
           * @return
           */
          public static String HMACSHA256(byte[] data, byte[] key)
          {
              try  {
                  SecretKeySpec signingKey = new SecretKeySpec(key, "HmacSHA256");
                  Mac mac = Mac.getInstance("HmacSHA256");
                  mac.init(signingKey);
                  return URLEncoder.encode(byte2Base64(mac.doFinal(data)));
              } catch (NoSuchAlgorithmException e) {
                  e.printStackTrace();
              } catch (InvalidKeyException e) {
                  e.printStackTrace();
              }
              return null;
          }
      
          private static String byte2Base64(byte[] bytes){
              return Base64.encodeBase64String(bytes);
          }
      
          public static void main(String[] args) throws Exception {
              String token = "54cc8224a92ddda750600157e17b****";
              System.out.println(getSignedUrl(token));
          }
      }

开启应用实例Token鉴权

应用发布后,新增绑定设备生成的应用实例可继承应用的Token,也支持生成单独的Token或关闭Token鉴权。

  1. 在应用编辑器左侧导航栏,单击设备

    应用绑定设备页显示所有已绑定设备的配置(即应用实例)。一个设备配置即生成一个独立的应用实例。

    如果您要新增应用实例,可单击新建设备配置,然后绑定设备。设备配置操作说明,请参见批量绑定设备

  2. 应用绑定设备页,单击设备配置名称对应的Token配置
  3. Token设置页,选择配置方式,单击确定

    配置方式选项:

    • 与应用保持一致:即继承应用的Token。如果应用Token鉴权被关闭,则该实例的鉴权也关闭。

      常用于应用和实例是同一个交付项目,无需进行隔离的场景。

    • 开启独立Token验证:开启独立Token验证后,系统为该实例生成独立的Token,原继承应用的Token将失效。您需及时更新应用地址URL配置。URL集成配置方法与本文上一章节中“集成应用的访问地址URL”一致。

      常用于有独立安全验证需求的场景,如单独交付的应用实例。

    • 不启用:关闭实例Token验证,不做安全验证。

      常用于独立交付应用实例,且不需要安全验证的场景。