程序问答   发布时间:2022-06-01  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了首次登录在 Android Kotlin 上抛出 401 Unaauthorized Access大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。

如何解决首次登录在 Android Kotlin 上抛出 401 Unaauthorized Access?

开发过程中遇到首次登录在 Android Kotlin 上抛出 401 Unaauthorized Access的问题如何解决?下面主要结合日常开发的经验,给出你关于首次登录在 Android Kotlin 上抛出 401 Unaauthorized Access的解决方法建议,希望对你解决首次登录在 Android Kotlin 上抛出 401 Unaauthorized Access有所启发或帮助;

我正在开发一个需要身份验证(登录)的安卓应用程序。

  • 当用户登录时,我的后端会生成一个不记名令牌 jwt
  • 我使用 SharedPreference 存储此令牌
  • 使用 Retrofit Okhttp Interceptor,我添加了一个拦截器,该拦截器需要此保存的不记名令牌才能访问授权端点。

问题是

  • 当用户第一次登录并访问任何授权端点时,它会抛出 401 - UnAuthorized。用户必须关闭应用程序,然后打开它(无需登录)端点开始工作,返回 200。(同时,我进行了检查,并且不记名令牌已发送并保存到应用程序中)但出于某种原因第一次,端点返回 401。除非我关闭应用程序并打开它,否则端点会抛出 200。

后端人员从我的应用程序中说它,因为不记名令牌已发送并且它第一次在邮递员上工作。 后端使用 NodeJs。

登录活动

if (it.data?.status == "success") {

   //get the token and store it
   val token = it.data.token

   //store token
   PreferenceHelper.storetoken = token

  //store user session
  PreferenceHelper.isLoggedInSeller = true

  //go to home activity
  val intent = Intent(this,SellerHomeActivity::class.java)
  intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_TASK)
  startActivity(intent)           

}

PreferenceHelper

object PreferenceHelper {

private const val name = "session"
private const val MODE = Context.MODE_PRIVATE
private lateinit var preferences: SharedPreferences

//SharedPreferences variables
private val hasLoggedInSeller = Pair("isLoginSeller",falsE)
private val loginToken = Pair("login_token","")


fun init(context: Context) {
    preferences = context.getSharedPreferences(name,MODE)
}

//an inline function to put variable and save it
private inline fun SharedPreferences.edit(operation: (SharedPreferences.Editor) -> Unit) {
    val editor = edit()
    operation(editor)
    editor.apply()
}

//check if seller has logged in
var isLoggedInSeller: Boolean
    get() = preferences.getBoolean(hasLoggedInSeller.first,hasLoggedInSeller.second)
    set(value) = preferences.edit {
        it.putBoolean(hasLoggedInSeller.first,value)
    }

//store login token for buyer
var storetoken: String?
    get() = preferences.getString(loginToken.first,loginToken.second)
    set(value) = preferences.edit {
        it.putString(loginToken.first,value)
    }
}

AuthInterceptor

class AuthInterceptor : Interceptor {

var  token = PreferenceHelper.storetoken

overrIDe fun intercept(chain: Interceptor.Chain): Response {

    val requestBuilder = chain.request().newBuilder()

    // If token has been saved,add it to the request
    token?.let {
        requestBuilder.addheader("Authorization","Bearer $it")
    }


    return chain.proceed(requestBuilder.build())
 }

}

改造

 @ProvIDes
@Singleton
fun provIDeRetrofit(gson: Gson) : Retrofit = Retrofit.builder()
    .baseUrl(EndPoints.bASE_URL)
    .clIEnt(
        OkhttpClIEnt.builder().also { clIEnt ->
            val logging = httpLoggingInterceptor()
            if (BuildConfig.DEBUG) {
                logging.setLevel(httpLoggingInterceptor.Level.bODY)
            }
            clIEnt.addInterceptor(logging)
            clIEnt.addInterceptor(AuthInterceptor())
            clIEnt.connectTimeout(120,TimeUnit.SECONDS)
            clIEnt.readTimeout(120,TimeUnit.SECONDS)
            clIEnt.protocols(Collections.singletonList(Protocol.http_1_1))
        }.build()
    )
    .addConverterFactory(ScalarsConverterFactory.create())
    .addConverterFactory(GsonConverterFactory.create(gson))
    .build()

退出

//remove session and token
PreferenceHelper.storetoken = ""
PreferenceHelper.isLoggedInSeller = false
val intent = Intent(this,MainActivity::class.java)
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_TASK)
startActivity(intent)

解决方法

问题出在 Interceptor 中,将 token 语句移到 intercept 方法中,该方法将为每个请求触发,否则每个实例只会创建一次,并将继续使用相同的令牌

class AuthInterceptor : Interceptor {
    override fun intercept(chain: Interceptor.Chain): Response {
        val requestBuilder = chain.request().newBuilder()
        PreferenceHelper.storeToken?.let {
            requestBuilder.addHeader("Authorization","Bearer $it")
        }
        return chain.proceed(requestBuilder.build())
    }
}

大佬总结

以上是大佬教程为你收集整理的首次登录在 Android Kotlin 上抛出 401 Unaauthorized Access全部内容,希望文章能够帮你解决首次登录在 Android Kotlin 上抛出 401 Unaauthorized Access所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。
标签:401上抛出