最近我遇到了一个问题,我无法提出解决方案,我正在按照Clean Architecture构建一个android应用程序,并且一切进行得很好,直到我不得不考虑身份验证角色为止。
我的应用程序具有以下结构(层): [ui](活动和片段)-> [表示](视图模型)-> [域](用例)->数据-> [远程,缓存,数据库]。
现在,让我们假设我要登录到我的应用程序,首先,我将进入登录屏幕并输入用户凭据,此后,我将调用LoginViewModel,然后调用LoginUseCase传递电子邮件和密码。反过来,用例将调用存储库,例如,进行身份验证,然后我将使用凭据向后端发出请求,如果一切正常,那么我将收到应以某种方式存储的令牌,问题从这里开始,我创建了一个拦截器,负责从标头中获取令牌,但是我必须保存它,为此我需要访问共享的首选项,在我的拦截器中访问它是正确的吗?在每次请求中,我都必须将其发送到后端,最好的方法是什么?
我也看过本教程https://medium.com/@tsaha.cse/advanced-retrofit2-part-2-authorization-handling-ea1431cb86be,但我认为在您的应用程序类内部访问数据库是不正确的,对吗?
感谢大家阅读本文,我正在努力寻找最佳方法,因此欢迎您提供任何帮助。
答案 0 :(得分:0)
它与CleanArchitecture
无关。这是您的问题的答案:
->是,您应该将其保存到SharedPreferences
,但不能访问SharedPreferences
内部的interceptor
。您应该制作interceptor
单身人士,并在setHeaderToken(String token)
中创建一个新的interceptor
函数。授权后,您可以将标头令牌设置为interceptor
。像这样:
class MyInterceptor{
String token = null;
public void setHeaderToken(String token){
//do set...
};
@Override
public Response intercept(Chain chain) throws IOException {
if(token == null) //do nothing
else // do add header
}
}
// add the singleton Interceptor to your OkHttp Client Builder and use it.