大佬教程收集整理的这篇文章主要介绍了首次登录在 Android Kotlin 上抛出 401 Unaauthorized Access,大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
我正在开发一个需要身份验证(登录)的安卓应用程序。
问题是
后端人员从我的应用程序中说它,因为不记名令牌已发送并且它第一次在邮递员上工作。 后端使用 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,请注明来意。