【发布时间】:2022-11-24 03:58:57
【问题描述】:
虽然登录应用程序我可以获得令牌、刷新令牌并保存它,但我不知道令牌的会话何时结束如何更新。如何在其中添加拦截器以更新令牌或可以使用其他一些方法?这是我的代码
1- API端点
@POST("identity/Identity/GetRefreshToken")
suspend fun refreshToken(): AuthTokenEntityDT0
2- AuthTokenEntityDT0 响应
data class AuthTokenEntityDT0(
@SerializedName("accessToken") val accessToken: String,
@SerializedName("refreshToken") val refreshToken: String,
@SerializedName("statusCode") val statusCode: Int,
@SerializedName("statusMessage") val statusMessage: String,
)
3 - 在这里提出请求
@Provides
@Singleton
fun provideAPIService(): ApiService {
val interceptor = HttpLoggingInterceptor()
interceptor.setLevel(HttpLoggingInterceptor.Level.BODY)
val client: OkHttpClient = OkHttpClient.Builder()
.addInterceptor(interceptor)
.addInterceptor { chain ->
val original = chain.request()
val requestBuilder = original.newBuilder()
.addHeader("Content-Type", "application/json; charset=UTF-8")
.addHeader("user-agent","Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/107.0.0.0 Safari/537.36")
.addHeader("Authorization", "Bearer $access_token")
val request = requestBuilder.build()
chain.proceed(request)
}
.build()
val retrofit = Retrofit.Builder()
.baseUrl(NativeBaseUrl.getBaseUrl())
.client(client)
.addConverterFactory(GsonConverterFactory.create())
.build()
return retrofit.create(ApiService::
class.java)
}
@Provides
fun provideApiRepository(apiService: ApiService): ApiRepository {
return ApiRepositoryImpl(apiService)
}
【问题讨论】:
-
好吧,获得令牌做得很好,你已经完成了一半。至于令牌何时过期,这取决于您使用的后端服务。从概念上讲,令牌告诉后端服务您的调用有效,您已通过身份验证。一旦您的访问或刷新令牌过期,您将收到 HTTP 401 或 403(这实际上取决于后端系统)任何经过身份验证的调用都可能导致此代码 - 让您知道您需要更新令牌。
-
@Marton 非常感谢您的帮助,我正在寻找以编程方式实现的帮助,例如,在 15 个 mint 令牌过期后,我得到了响应代码 401,如何实现拦截器以获取错误 401 并更新令牌,感谢任何建议,谢谢
-
您的代码走在正确的轨道上,您已经添加了自定义拦截器。你知道如何获得新令牌吗?后端服务应该采用某种机制,您可以在其中传递 accesToken 以换取 refreshToken。
标签: android kotlin retrofit okhttp