NetSuite 的 OAuth 1.0 身份验证

ser*_*0ne 5 java oauth netsuite kotlin

我徒劳地尝试让 OAuth 1.0 身份验证适用于 Oracle Netsuite。当我使用 PostMan 生成身份验证标头时,它可以工作,但我的代码生成了错误的签名,尽管我遵循了我能找到的有关如何为 OAuth 1.0 生成 HMAC-SHA1 签名的所有步骤

源代码(科特林)

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)))
    }
}
Run Code Online (Sandbox Code Playgroud)

我做错了什么?

bkn*_*hts 1

Netsuite OAuth 不工作的Node 中有一个工作 oAuth 连接的示例

这行:

headers.Authorization += ',realm="' + config.accountId + '"';
Run Code Online (Sandbox Code Playgroud)

似乎是你所缺少的。

领域不应该是发送到计算签名的哈希的一部分。