在Kotlin中计算oauth_signature和oauth_nonce

问题描述 投票:0回答:1

我正在开发一个具有使用Twitter功能登录的Twitter Android应用。登录效果很好。但是我的问题是我想搜索用户。我用谷歌搜索并找到端点。

https://api.twitter.com/1.1/users/search.json

然后我创建了一个改造函数来获取搜索到的用户:

@GET("users/search.json")
suspend fun searchUser(
    @Header("authorization") header: String,
    @Query("q") search: String
) : Response<List<InspectedUserPOJO>>

然后从这样的片段中调用它:

CoroutineScope(viewModelJob).launch {
            withContext(IO) {
                try {
                    val response = RetrofitInstance.retrofitInstance!!.searchUser(generateHeader(),"teyyihan")
                    if (response.isSuccessful) {
                        if (response.body() != null) {
                           // getting response
                        } else {
                        }
                    } else {} } catch (e: Exception) {}
            }

        }

这里是generateHeader()函数:

fun generateHeader(): String{
    var header = "OAuth oauth_consumer_key=\""+/* my consumer key*/+"\",oauth_token=\""+CurrentUserInfo.authToken+"\",oauth_signature_method=\"HMAC-SHA1\",oauth_timestamp=\"1580300189\",oauth_nonce=\"iBryT2SIbXa\",oauth_version=\"1.0\",oauth_signature=\"EvMhzhOKw%2BVhRKw5Iz%2F48VdWdlQ%3D\""
    return header
}

实际上,此标头来自邮递员。我测试了此标头,效果很好。但是,每次我发送请求oauth_nonce和oauht_signature更改时。我试图用我的oauht_token更改oauth_token,但是它不起作用。那么如何计算oauth_nonce和oauth_signature?

此外,如果您知道java的方式,请与我合作1年。

android kotlin twitter oauth twitter-oauth
1个回答
0
投票

一种可能的解决方案是,您使用和拦截器添加标头,然后构建改造对象:

Interface YourService:{
//Your method 
@GET("users/search.json")
suspend fun searchUser(
    @Header("authorization") header: String,
    @Query("q") search: String
) : Response<List<InspectedUserPOJO>>

companion object:{
 fun createService(): YourService {



            val headerAuthorizationInterceptor = Interceptor { chain ->
                var request = chain.request()
                val headers = request.headers().newBuilder().add("OAuth oauth_consumer_key", /*consumer key*/)
                        .add("Second Header", Second key)
                        .add("Content-Type", "application/json").build() //I am guessing content type is application/json

                request = request.newBuilder().headers(headers).build()
                chain.proceed(request)
            }


            val okHttpClient = OkHttpClient.Builder()
                    .readTimeout(20, TimeUnit.SECONDS)
                    .connectTimeout(20, TimeUnit.SECONDS)
                    .addInterceptor(headerAuthorizationInterceptor)
                    .build()

            val retrofit = Retrofit.Builder()
                    .baseUrl(Your base url)
                    .client(okHttpClient)
                    .addCallAdapterFactory(RxJava2CallAdapterFactory.create())
                    .addConverterFactory(ScalarsConverterFactory.create())
                    .addConverterFactory(GsonConverterFactory.create())
                    .build()
            return retrofit.create(YourService::class.java)
        }
    }
}

完成此操作后,headerAuthorizationInterceptor变量就是您添加标头的位置。希望对您有所帮助

© www.soinside.com 2019 - 2024. All rights reserved.