清洁架构和身份验证。正确的方式?

Posted

技术标签:

【中文标题】清洁架构和身份验证。正确的方式?【英文标题】:Clean Architecture and authentication. Correct way? 【发布时间】:2019-07-08 18:34:26 【问题描述】:

我正在开发基于 Clean Architecture 模式的 android 应用程序,但我怀疑如何以干净的方式实现用户身份验证。就干净架构而言,以下解决方案是否干净?

我会创建如下用例(从表示层执行):

LoginUseCase(用于提供的登录名和密码通过远程服务获取api令牌并保存在本地令牌源中) LogoutUseCase(从LocalTokenSource清除令牌)

LocalTokenSource 接口将存储在领域层,其实现在数据层 - 一种存储库)

为了在每次应用启动时执行令牌刷新(从用户的角度来看,这不是一个用例,对吧?)我会在域层创建 SessionManager 组件。 SessionManager 将负责刷新令牌并将其保存在 LocalTokenSource 中。每次活动开始时,我都会从它的演示者那里执行refreshToken() 注入SessionManager. 你如何看待解决方案?

如果它是干净的,那么如何处理将令牌传递给远程服务以执行其他需要令牌的 API 方法?假设我有 PostsRepository 从远程服务获取帖子数据。我应该将令牌从用例传递到像repo.getPosts(token) 这样的存储库方法吗?或者将LocalTokenSource 注入到存储库中,这样它就可以自己读取令牌?第二个选项会不会违反 Clean Architecture 规则,因为 LocalTokenSource 将用于 2 层?

【问题讨论】:

【参考方案1】:

您必须决定的核心问题是:您要将授权(以及令牌的使用)建模为业务逻辑的一个方面,还是要将其视为“实施细节”。

如果您首先决定,有专门的用例,将 SessionManager 添加到域层并将令牌传递到存储库将是一个一致的建模。

如果您决定稍后,登录/注销/刷新以及令牌的存在可能最好保留在“幕后”,因此在框架或网关层中。

这两种方法都将遵循 Clean Architecture 的规则(只要您不违反依赖关系规则)。

【讨论】:

感谢您的意见,现在我可以更有信心地工作了 ;-)

以上是关于清洁架构和身份验证。正确的方式?的主要内容,如果未能解决你的问题,请参考以下文章

盘点微服务架构下的诸多身份验证方式

如何以正确的方式实施客户端证书身份验证?

微服务方法之间的身份验证

用户和身份验证的分布式数据库设计架构用例

MySQL身份验证——Pluggable Authentication

将标头用于身份验证令牌的主要原因是啥?