Аутентификация OAuth 1.0 для NetSuite - PullRequest
0 голосов
/ 08 февраля 2019

Напрасно я пытался заставить работать аутентификацию 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)))
    }
}

Что я сделал не так?

1 Ответ

0 голосов
/ 08 февраля 2019

Есть пример работающего соединения oAuth в узле на Netsuite OAuth не работает

Эта строка:

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

, кажется, то, что вам не хватает.

область не должна быть частью хэша, отправленного для вычисления подписи.

...