tencent_get_appid_probe.dart 2.49 KB
import 'dart:convert';
import 'dart:io';

import 'package:crypto/crypto.dart';

Future<void> main() async {
  const secretId = 'AKID9Vgy8FEC5qSxLcllVCmXzJWaVSI0Z2Nb';
  const secretKey = 'c2c5MTOBo5d9XilhaLzVSG4DE7qRuCJF';
  const service = 'cam';
  const host = 'cam.tencentcloudapi.com';
  const version = '2019-01-16';
  const action = 'GetUserAppId';
  const region = '';
  const payload = '{}';

  final int ts = DateTime.now().millisecondsSinceEpoch ~/ 1000;
  final String date = DateTime.fromMillisecondsSinceEpoch(ts * 1000, isUtc: true)
      .toIso8601String()
      .substring(0, 10);

  final String hashedPayload = sha256.convert(utf8.encode(payload)).toString();
  final String canonicalHeaders = 'content-type:application/json; charset=utf-8\n'
      'host:$host\n'
      'x-tc-action:getuserappid\n';
  const signedHeaders = 'content-type;host;x-tc-action';
  final String canonicalRequest = 'POST\n/\n\n$canonicalHeaders\n$signedHeaders\n$hashedPayload';
  final String hashedCanonicalRequest = sha256.convert(utf8.encode(canonicalRequest)).toString();

  final String credentialScope = '$date/$service/tc3_request';
  final String stringToSign = 'TC3-HMAC-SHA256\n$ts\n$credentialScope\n$hashedCanonicalRequest';

  final List<int> secretDate = Hmac(sha256, utf8.encode('TC3$secretKey')).convert(utf8.encode(date)).bytes;
  final List<int> secretService = Hmac(sha256, secretDate).convert(utf8.encode(service)).bytes;
  final List<int> secretSigning = Hmac(sha256, secretService).convert(utf8.encode('tc3_request')).bytes;
  final String signature = Hmac(sha256, secretSigning).convert(utf8.encode(stringToSign)).toString();

  final String authorization = 'TC3-HMAC-SHA256 '
      'Credential=$secretId/$credentialScope, '
      'SignedHeaders=$signedHeaders, '
      'Signature=$signature';

  final HttpClient client = HttpClient();
  try {
    final HttpClientRequest req = await client.postUrl(Uri.parse('https://$host/'));
    req.headers.set('Authorization', authorization);
    req.headers.set('Content-Type', 'application/json; charset=utf-8');
    req.headers.set('Host', host);
    req.headers.set('X-TC-Action', action);
    req.headers.set('X-TC-Timestamp', '$ts');
    req.headers.set('X-TC-Version', version);
    if (region.isNotEmpty) req.headers.set('X-TC-Region', region);
    req.write(payload);
    final HttpClientResponse res = await req.close();
    final String body = await res.transform(utf8.decoder).join();
    print('HTTP ${res.statusCode}');
    print(body);
  } finally {
    client.close();
  }
}