本ドキュメントでは、DataV プロジェクトのトークン内のデジタル署名付きパラメーターの妥当性を確認する方法について説明します。

これを行うには、プロジェクトを公開するときに DataV コンソールにログインし、 [Publish] ページに移動してトークン認証を有効にします。 この妥当性確認は、プロジェクトの URL で渡されるデジタル署名付きパラメーターの認証に役立ちます。 さらに、これらのパラメータを不正な変更から保護し、プロファイルとプロジェクトデータの全体的なセキュリティを向上させます。

背景

従業員 ID を 123 として、DataV プロジェクトを公開すると仮定します。 トークンを使用してプロジェクトの URL が計算されます。 以下のように GET メソッドを使用して従業員 ID workid が渡されると、以下のプロジェクトデータが提示されます。 https://datav.aliyun.com/share/xxx?_datav_time=1556022195845&_datav_signature=%2BDZFj3QDIla%2F00fBZLdJMgk2Z1Ocs9MLL1GiHdYkwa0 %3D&workid = 123

ただし、プロジェクト URL の workid パラメータの値を次の数字に変更すると、従業員 ID 124 のユーザーのプロファイルとプロジェクトデータを表示することができます。https://datav.aliyun.com/share/xxx?_datav_time=1556022195845&_datav_signature=%2BDZFj3QDIla%2F00fBZLdJMgk2Z1Ocs9MLL1GiHdYkwa0%3D&workid=124

したがって、不正な変更から保護するために、パラメータが URL に渡されたときにデジタル署名をして、パラメータの有効性をチェックできる必要があります。 ユーザーが許可なくデジタル署名付きパラメータの値を変更すると、要求された URL にアクセスできなくなります。

前提条件

  • プロジェクトはトークン認証を有効にして公開します。 詳細については、「トークン認証の設定」をご参照ください。
  • GET メソッドは、パラメータを不正な変更から保護する必要があるときに使用します。該当するパラメータをプロジェクトの URL の最後に追加します。

パラメータのデジタル署名

デジタル署名付きパラメータの名前は datav_sign_ 文字列で始まります。 この文字列の後に、パラメータ名を含む有効な文字を続けることができます。 したがって、デジタル署名されたパラメータの名前の正規表現は、/^datav_sign_.*/ です。

パラメータが前述の規則に準拠していない場合、そのパラメータにデジタル署名は付きません。 さらに、システムは有効性を確認しないため、値を変更することができます。

デジタル署名付きパラメータによる URL 計算

次の Node.js コードを実行して、デジタル署名付きパラメータを使用して URL を計算できます。
const crypto = require('crypto');
const querystring = require('querystring');
const signedQueryParamReg = /^datav_sign_.*/;  // A parameter that complies with the regular expression needs to be digitally signed.

const token = "93TWnmeBtxxxxxxxxxx3thGyAgzennsS";
const screenID ="b92xxxxxxxxxxxxxxxxxx27b4c538cd4";
const time = Date.now();

const customeParams = {
  datav_sign_no: 123998,
  name: 123
};
let signParamsStr = Object.keys(customeParams)
  .filter(paramName => customeParams[paramName] && signedQueryParamReg.test(paramName))
  .sort()
  .map(param => `${param}=${customeParams[param]}`)
  .join('&');
let stringToSign = [screenID, time];
signParamsStr && stringToSign.push(signParamsStr);
stringToSign = stringToSign.join('|');
let signature = crypto.createHmac('sha256', token).update(stringToSign).digest().toString('base64');
let queryParams = {
  _datav_time: time,
  _datav_signature: signature
};

Object.keys(customeParams).forEach(paramName => {
  queryParams[paramName] = customeParams[paramName];
});

let url = `http://datav.aliyun.com/share/${screenID}?${querystring.stringify(queryParams)}`;
console.log(url);

以下の URL を取得します。

http://datav.aliyun.com/share/b92db8e09358c82efca0727b4c538cd4?_datav_time=1556023246894&_datav_signature=GGSbvxlemUeBoRVco8JgrJVWRcmao7NuRYt2OrGBC5g%3D&datav_sign_no=123998&name=123

URL の有効期間

datav_sign_no パラメータの値を変更すると、URL にアクセスできなくなります。 理由は、このパラメータがパラメータ署名規則に準拠しており、デジタル署名が付いているからです。 したがって、このパラメータの値を変更すると、URLの計算に影響があります。

name パラメータの値を変更しても、引き続き URL にアクセスできます。 理由は、このパラメータがパラメータ署名規則に準拠しておらず、デジタル署名が付いていないからです。 したがって、このパラメータの値を変更しても URLの計算には影響しません。

パラメータ署名規則については、「パラメータのデジタル署名」を参照してください。

妥当性確認の実施

  1. デジタル署名が必要なパラメータを決定します。 つまり、許可なしに変更することができないパラメータを決定します。
  2. トークン認証を有効にするときに、DataV プロジェクトを公開します。 詳細については、「プロジェクトの公開」をご参照ください。
  3. プロジェクトの URL を計算します。 詳細については、「デジタル署名付きパラメータによる URL 計算」をご参照ください。
  4. 前の手順で取得した URL を使用してプロジェクトにアクセスします。 デジタル署名付きパラメータの有効性が自動的に確認されます。

    デジタル署名付きパラメータの値を変更した後にプロジェクトにアクセスすると、アクセス要求は拒否されます。