【问题标题】:Dagger hilt & oauth interceptor - How to update SingletonDagger hilt & oauth 拦截器 - 如何更新 Singleton
【发布时间】:2021-10-28 19:37:01
【问题描述】:

我正在使用 Hilt 进行依赖注入。我正在尝试实现一个 oauth 拦截器,它将在登录后对我的请求进行身份验证。

我遇到的问题与oauthManager(context).getToken() 等有关。OauthManager 本质上只是一个用于访问EncryptedSharedPreferences 的类。但是由于我的提供方法是Singleton,所以我对共享首选项所做的任何更新都不会反映到我的 okhttp 实例中。

应用程序开始时未经过身份验证,稍后会变为。我可能可以使用像ViewModelScoped 这样的另一个范围来解决这个问题,但我想知道是否有更好的方法来更新 oauth 凭据。

@Singleton
@Provides
@Named(NAME_WITH_OAUTH)
fun provideOkHttp(
    @ApplicationContext context: Context
) = OkHttpClient
        .Builder()
        .addInterceptor(
            OauthInterceptor(
                consumerKey = Constants.CONSUMER_KEY,
                consumerSecret = Constants.CONSUMER_SECRET,
                accessToken = oauthManager(context).getToken(),
                accessSecret = oauthManager(context).getSecret(),
                verifier = oauthManager(context).getVerifier()
            )
        )
        .build()

提前致谢!

【问题讨论】:

    标签: android oauth retrofit dagger-hilt


    【解决方案1】:

    这几乎不是刀柄问题,而是结构问题。

    您将参数传递给拦截器,而不是在需要时。

    您需要注入Interceptor 而不是在您关闭时创建实例。

    @Provides fun provideMyInterceptor(authManager : AuthManager){
        return OAuthInterceptor(
                    consumerKey = Constants.CONSUMER_KEY,
                    consumerSecret = Constants.CONSUMER_SECRET,
                    authManager = authManager)
    
    }
    
    @Singleton
    @Provides
    @Named(NAME_WITH_OAUTH)
    fun provideOkHttp(oAuthInterceptor : OAuthInterceptor) = OkHttpClient
            .Builder().addInterceptor(oAuthInterceptor).build()
    

    拦截器类应该取决于你的AuthManager

    class OAuthInterceptor(
         private val consumerKey : String,
         private val consumerSecret : String,
         private val authManager : AuthManager)
    
    private val accessToken get() = authManager.getAccessToken()
    
    /** other code reducted **/
    
    

    请注意,每次访问该属性时,getter 都会调用getAccessToken()

    或者,您可以使用Provider<String> 作为您的令牌。调用tokenProvider.get() 将请求Provider 在每次调用时提供该实例的新快照。

    【讨论】:

      猜你喜欢
      • 2021-09-18
      • 2022-11-16
      • 1970-01-01
      • 2022-01-16
      • 1970-01-01
      • 1970-01-01
      • 2010-09-07
      • 2017-12-18
      • 1970-01-01
      相关资源
      最近更新 更多