Kotlin Twitter Outh-Signature

我试图得到一个有效的oaut签名,但我无法做到这一点。 我在网上搜索了一段时间,发现了一些有用的网站,但即使有90%的代码,它不工作。

我已经有了消费者密码,消费者密码,访问令牌和令牌密码。 我创建了我已经拥有的所有参数(NameValuePair)的列表,并在我对它们中的每一个进行百分比编码之后,通过键对它们进行排序。

然后我建立基本上是百分比编码的汇总的签名基本字符串。

随着消费者的秘密和令牌的秘密也编码和合并与他们之间的“&”我扔在HMAC-SHA1函数签名基础字符串和新创建的密钥混合字符串。

该函数的结果是一个byteArray,然后转换为一个字符串并用作oauth_signature。

但它没有工作。 我不能进一步调试,因为我刚开始一个HTTP请求后得到一个401 HTTP错误授权请求。

有什么建议么 ?

private fun generateNonce(): String { val random = Random() return java.lang.Long.toString(Math.abs(random.nextLong())) + System.currentTimeMillis() } private fun generateSignature(signatueBaseStr: String, oAuthConsumerSecret: String, oAuthTokenSecret: String?): String { var byteHMAC: ByteArray? = null try { val mac = Mac.getInstance("HmacSHA1") val spec: SecretKeySpec spec = if (null == oAuthTokenSecret) { val signingKey = encode(oAuthConsumerSecret) + '&' SecretKeySpec(signingKey.toByteArray(), "HmacSHA1") } else { val signingKey = encode(oAuthConsumerSecret) + '&' + encode(oAuthTokenSecret) SecretKeySpec(signingKey.toByteArray(), "HmacSHA1") } mac.init(spec) byteHMAC = mac.doFinal(signatueBaseStr.toByteArray()) } catch (e: Exception) { e.printStackTrace() } return Base64.getEncoder().encodeToString(byteHMAC); } private fun encode(value: String): String { var encoded = "" try { encoded = URLEncoder.encode(value, "UTF-8") } catch (e: Exception) { e.printStackTrace() } var sb = "" var focus: Char var i = 0 while (i < encoded.length) { focus = encoded[i] if (focus == '*') { sb += "%2A" } else if (focus == '+') { sb += "%20" } else if (focus == '%' && i + 1 < encoded.length && encoded[i + 1] == '7' && encoded[i + 2] == 'E') { sb += '~' i += 2 } else { sb += focus } i++ } return sb } private fun getOAuth(requestUrl: String, searchField: NameValuePair, consumerKey: String, consumerSecret: String, accessToken: String, tokenSecret: String): String { val qparams = ArrayList() //searchField is for example : screen_name , TwitterDEV qparams.add(searchField) qparams.add(BasicNameValuePair("oauth_consumer_key", consumerKey)) qparams.add(BasicNameValuePair("oauth_nonce", "" + generateNonce())) qparams.add(BasicNameValuePair("oauth_signature_method", "HMAC-SHA1")) qparams.add(BasicNameValuePair("oauth_timestamp", "" + System.currentTimeMillis() / 1000)) qparams.add(BasicNameValuePair("oauth_token", accessToken)) qparams.add(BasicNameValuePair("oauth_version", "1.0")) val encodedParams = ArrayList() qparams.forEach { encodedParams.add(BasicNameValuePair(encode(it.name), encode(it.value))) } encodedParams.sortBy { nameValuePair -> nameValuePair.name } var paramsString = "" for (i in (0 until encodedParams.size)) { paramsString += encodedParams[i].name + "=" + encodedParams[i].value if (i != encodedParams.size - 1) paramsString += "&" } var signatureRequestURL = "GET&" + encode(requestUrl) + "&" + encode(paramsString) val signature = generateSignature(signatureRequestURL, consumerSecret, tokenSecret) qparams.add(BasicNameValuePair("oauth_signature", signature)) var urlParams = "" for (i in (0 until qparams.size)) { urlParams += qparams[i].name + "=" + qparams[i].value if (i != qparams.size - 1) urlParams += "&" } return requestUrl + "?" + urlParams }