Напрасно я пытался заставить работать аутентификацию OAuth 1.0 для Oracle Netsuite.Когда я генерирую заголовок аутентификации с помощью PostMan, он работает, но мой код генерирует неверную подпись, несмотря на то, что я выполнил все шаги, которые мог найти, как сгенерировать подпись HMAC-SHA1 для OAuth 1.0
Исходный код (Kotlin)
class NetsuiteAuthenticationScheme {
private val algorithm = "HmacSHA1"
private val charset = Charsets.UTF_8
fun setAuthenticationHeaders(headers: HttpHeaders, url: String?) {
val authentication = mutableMapOf(
"realm" to "REALM",
"oauth_consumer_key" to "CONSUMER_KEY",
"oauth_token" to "TOKEN",
"oauth_signature_method" to "HMAC-SHA1",
"oauth_version" to "1.0",
"oauth_timestamp" to "TIMESTAMP",
"oauth_nonce" to "NONCE"
)
val signatureUrl = listOf(
"POST",
URLEncoder.encode(url, charset.displayName()),
URLEncoder.encode(
URLEncodedUtils.format(
authentication
.toList()
.sortedBy { it.first }
.map { BasicNameValuePair(it.first, it.second) },
charset.displayName()
), charset.displayName()
)
).joinToString("&")
val signatureKey = listOf(
"CONSUMER_SECRET",
"TOKEN_SECRET"
).joinToString("&")
authentication["oauth_signature"] = computeSignature(signatureUrl, signatureKey)
val authenticationHeaderValue = authentication
.toList()
.joinToString { "${it.first}=\"${URLEncoder.encode(it.second, charset.displayName())}\"" }
headers.contentType = MediaType.APPLICATION_JSON
headers.add("Authorization", "OAuth $authenticationHeaderValue")
}
private fun computeSignature(data: String, key: String): String {
val mac = Mac.getInstance(algorithm)
mac.init(SecretKeySpec(key.toByteArray(charset), algorithm))
return Base64.encodeBytes(mac.doFinal(data.toByteArray(charset)))
}
}
Что я сделал не так?