【发布时间】:2019-02-08 19:43:31
【问题描述】:
我试图让 OAuth 1.0 身份验证适用于 Oracle Netsuite,但徒劳无功。当我使用 PostMan 生成身份验证标头时,它可以工作,但是我的代码生成了错误的签名,尽管我遵循了所有我能找到的关于如何为 OAuth 1.0 生成 HMAC-SHA1 签名的步骤
源代码(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)))
}
}
我做错了什么?
【问题讨论】:
标签: java kotlin oauth netsuite