0

我需要获得一个 here-API 令牌才能在 HERE Matrix Routing API 中使用它,但我无法获得它。服务器的响应总是返回以下

"{"errorId":"ERROR-b877e827-1ed6-4a2d-bed8- 
546d1b9b3bd6","httpStatus":401,"errorCode":401205,"message":"Unsupported 
signature method in the header. Require HMAC- 
SHA256","error":"invalid_request","error_description":"errorCode: 
'401205'. Unsupported signature method in the header. Require HMAC- 
SHA256"}"

这是我的代码:

    var grant_type = 'client_credentials';
var oauth_consumer_key = 'koauth_consumer_key';
var access_key_secret = 'access_key_secret';
var oauth_nonce = DateTime.now().millisecondsSinceEpoch.toString();
var oauth_timestamp = (new DateTime.now().toUtc().millisecondsSinceEpoch / 100).toString();
var oauth_signature_method = 'HMAC-SHA256';
var oauth_version = '1.0';
var url = 'https://account.api.here.com/oauth2/token';

create_signature(secret_key, signature_base_string) {
var temp = Hmac(sha256, utf8.encode(secret_key)).convert(utf8.encode(signature_base_string));
var hmacBase64 = base64Encode(temp.bytes);
print(hmacBase64);
return hmacBase64;
}

create_parameter_string(grant_type, oauth_consumer_key, oauth_nonce, oauth_signature_method, oauth_timestamp, oauth_version) {
parameter_string = '';
parameter_string = parameter_string + 'grant_type=' + grant_type;
parameter_string = parameter_string + '&oauth_consumer_key=' + oauth_consumer_key;
parameter_string = parameter_string + '&oauth_nonce=' + oauth_nonce;
parameter_string = parameter_string + '&oauth_signature_method=' + oauth_signature_method;
parameter_string = parameter_string + '&oauth_timestamp=' + oauth_timestamp;
parameter_string = parameter_string + '&oauth_version=' + oauth_version;
return parameter_string;
}

创建encoded_oauth_signature

var parameter_string = create_parameter_string(grant_type, oauth_consumer_key, oauth_nonce, oauth_signature_method, oauth_timestamp, oauth_version);
var encoded_parameter_string = Uri.encodeComponent(parameter_string);
var encoded_base_string = 'POST' + '&' + Uri.encodeComponent(url) + '&' + encoded_parameter_string;
var signing_key = access_key_secret + '&';
var oauth_signature = create_signature(signing_key, encoded_base_string);
var encoded_oauth_signature = Uri.encodeComponent(oauth_signature);

// #---------------------Requesting Token---------------------
var body = {
'grant_type': '$grant_type'
};

准备正文和标题

var headers = {
'Content-Type': 'application/x-www-form-urlencoded',
'Authorization': 'OAuth oauth_consumer_key="$oauth_consumer_key",oauth_nonce="$oauth_nonce",oauth_signature_method="HMAC-SHA256",oauth_timestamp="$oauth_timestamp",oauth_version="1.0",oauth_signature="$encoded_oauth_signature"'
};

获取令牌:

 gettokenpy() async {
    final response = await http.post(
    Uri.parse(url),
    body: body,
    headers: headers,
    );
    return response.body.toString();
}
4

1 回答 1

0

该错误消息表明不支持输入签名方法。它应该是HMAC-SHA256。以下指南可以帮助您了解如何获取 OAuth 2.0 令牌。

https://developer.here.com/documentation/identity-access-management/dev_guide/topics/sdk.html#step-3-request-a-token

于 2021-12-20T08:42:57.477 回答