应用鉴权

更新时间:2019-04-03 14:52:51

概述

默认的web可视化应用是没有任何安全验证的,为了在安全场景(如信息安全、设备控制保护)下提供服务,可以开启token鉴权,开启后只有拥有token加签的访问者才允许访问应用。该功能常用于将可视化应用嵌入到第三方网站/应用(如web后台、移动app等)。
image.png

名词解释

名词 解释
token鉴权 token指系统颁发的随机码,作用类似于安全证书;使用该token进行信息签名,可以让接收方快速核验身份,保证安全性

操作说明

开启应用鉴权

image.png

  1. 在应用设置 -> 基本信息界面,开启“token验证”

image.png
image.png

  • 如图,在开启“Token验证”时,应用会为您生成一个 Token,您需要记录下这个 Token,以备后用

  • 在这个时候,如果其他人尝试直接打开您所分享的页面,您会收到一个 Access Denied。表示您的访问被拒绝了

  • 复制token

image.png

  1. 集成

开启Token后,如果想要打开您的页面,就需要完成下面几个步骤:

  1. 将当前时间(毫秒)转化为字符串。
  2. 使用 token 通过 HMAC-SHA256 base64 对上一步得到的字符串进行加密。
  3. 将时间和加密后的签名分别命名为 time, signature 放入 url 的 querystring 中。

下面是示例:

PHP:

<?php
  $token = "54cc8224a92ddda750600157e17b33c8";
  $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 = "54cc8224a92ddda750600157e17b33c8";
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 = "54cc8224a92ddda750600157e17b33c8";
        System.out.println(getSignedUrl(token));
    }
}
  1. 测试访问

使用含有token签名的url即可访问

开启绑定设备的应用实例鉴权

绑定设备的应用实例,支持继承应用的token,也支持单独开启/关闭token鉴权。
image.png

  1. 在设备集成 -> 集成列表界面,可以看到所有绑定设备的应用实例,“Token验证码”栏可以查看/复制其token码
  2. 点击“操作”栏的“Token配置”,可以修改该实例的token配置

    1. 默认配置为“与应用设置保持一致”,即应用为开启,则该实例也开启,且token保持一致;应用为关闭,则该实例也关闭。该选项常用于应用和实例都是同一个交付项目,无需进行隔离的场景。
    2. 选择“开启独立Token验证”,则实例独立开启token验证,拥有自己独立的token码。该选项常用于有独立安全验证需求的场景,如单独交付应用实例的场景。
    3. 选择“不启用”,则实例独立关闭token验证,不做安全验证。该选项常用于独立交付应用实例,且不需要安全验证的场景。

      image.png

  3. 集成,同应用鉴权的集成

开启Token后,如果想要打开您的页面,就需要完成下面几个步骤:

  1. 将当前时间(毫秒)转化为字符串。
  2. 使用 token 通过 HMAC-SHA256 base64 对上一步得到的字符串进行加密。
  3. 将时间和加密后的签名分别命名为 time, signature 放入 url 的 querystring 中。

下面是示例:

PHP:

<?php
  $token = "54cc8224a92ddda750600157e17b33c8";
  $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 = "54cc8224a92ddda750600157e17b33c8";
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 = "54cc8224a92ddda750600157e17b33c8";
        System.out.println(getSignedUrl(token));
    }
}
  1. 测试访问

使用含有token签名的url即可访问

results matching ""

    No results matching ""