【问题标题】:Authentication role - Clean Architecture身份验证角色 - 清洁架构
【发布时间】:2019-03-07 03:11:42
【问题描述】:

最近我遇到了一个我无法提出解决方案的问题,我正在按照 Clean Architecture 构建一个 android 应用程序,一切都很好,直到我不得不考虑身份验证角色。

我的应用中有这样的结构(层): [ui](活动和片段)-> [演示文稿](视图模型)-> [域](用例)-> 数据 -> [远程、缓存、数据库]。

现在,假设我想登录我的应用程序,首先我将通过登录屏幕并输入用户凭据,然后我将调用 LoginViewModel,然后调用 LoginUseCase 传递电子邮件和密码。反过来,用例将调用存储库,比如说,进行身份验证,然后我将使用凭据向后端发出请求,如果一切正常,那么我将收到一个我应该以某种方式存储的令牌,问题从这里开始,我创建了一个拦截器,负责从标头获取令牌,但我必须保存它,为此我需要访问共享首选项,在我的拦截器中访问它是否正确?在我必须将其发送到后端的每个请求中,最好的方法是什么?

我也看过这个教程https://medium.com/@tsaha.cse/advanced-retrofit2-part-2-authorization-handling-ea1431cb86be,但我认为在你的应用程序类中访问数据库是不正确的,我错了吗?

感谢大家阅读本文,我正在努力寻找最佳方法,因此欢迎任何帮助。

【问题讨论】:

  • 是否可以从 Retrofit 的 Response 类中取回新的令牌?如果是,则在获取 Retrofit 网络结果的存储库模块中,我们可以将此类令牌保存到缓存模块中。

标签: android mvvm kotlin clean-architecture


【解决方案1】:

它与CleanArchitecture 并没有真正的关系。以下是您问题的答案:

  1. 我必须保存它,为此我需要访问共享首选项,在我的拦截器中访问它是否正确?

-> 是的,你应该将它保存到SharedPreferences,但你不应该在interceptor 中访问SharedPreferences。你应该让你的interceptor Singleton 并在你的interceptor 中创建一个新的setHeaderToken(String token) 函数。授权后,您可以将标头令牌设置为您的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.
  1. 您不应该直接将应用程序类与您的数据库连接。您应该使用域层来代替。

【讨论】:

  • 感谢您的回复,但问题是,如果我无法将令牌保存在拦截器中,如何将其保存到共享首选项中?
  • @Boni 不确定您的意思。您应该将令牌保存到令牌 API 中的共享首选项中。
  • “in your token API”是什么意思,很抱歉打扰您,但我很难找到解决方法
猜你喜欢
  • 2019-07-08
  • 2016-09-23
  • 2015-05-31
  • 1970-01-01
  • 1970-01-01
  • 2016-12-22
  • 2013-08-23
  • 2020-08-13
  • 2012-08-06
相关资源
最近更新 更多