【问题标题】:OAuth 1.0 Authentication for NetSuiteNetSuite 的 OAuth 1.0 身份验证
【发布时间】: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


    【解决方案1】:

    Netsuite OAuth Not Working 的 Node 中有一个有效的 oAuth 连接示例

    这一行:

    headers.Authorization += ',realm="' + config.accountId + '"';
    

    似乎是你所缺少的。

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

    【讨论】:

    • 在这种情况下,accountId 不是我的身份验证映射中的realm 吗?我的意思是最终它可能是相同的值,具有不同的属性名称,对吧?
    • 不应成为签名的一部分。它是在计算 oAuth 哈希后添加的。
    • 你有没有得到这个工作@MatthewLayton?我目前面临同样的问题!
    • 其实我已经想通了,并在另一个问题上发布了答案:stackoverflow.com/a/60059112/1728788
    猜你喜欢
    • 2021-05-12
    • 1970-01-01
    • 1970-01-01
    • 2023-03-05
    • 2018-05-02
    • 1970-01-01
    • 2016-11-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多