本ドキュメントでは、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 計算
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の計算には影響しません。
パラメータ署名規則については、「パラメータのデジタル署名」を参照してください。
妥当性確認の実施
- デジタル署名が必要なパラメータを決定します。 つまり、許可なしに変更することができないパラメータを決定します。
- トークン認証を有効にするときに、DataV プロジェクトを公開します。 詳細については、「プロジェクトの公開」をご参照ください。
- プロジェクトの URL を計算します。 詳細については、「デジタル署名付きパラメータによる URL 計算」をご参照ください。
- 前の手順で取得した URL を使用してプロジェクトにアクセスします。 デジタル署名付きパラメータの有効性が自動的に確認されます。
デジタル署名付きパラメータの値を変更した後にプロジェクトにアクセスすると、アクセス要求は拒否されます。