gpt4 book ai didi

c# - 我应该将使用 DDD 和 CQRS 方式刷新访问 token 的代码放在哪里?

转载 作者:行者123 更新时间:2023-12-02 00:08:09 25 4
gpt4 key购买 nike

我正在使用 ASP.NET Core 并学习 DDD 和 CQRS(包括 MediatR)。我读过eshopcontainers文件。在我的应用程序中,我们需要在我们的 SQL 数据库中存储每个用户的谷歌访问 token 和刷新 token ,因为我们必须定期检查 gmail 中的某些状态。当我们实现该功能时,或多或少我们想编写以下逻辑。

1. Get the access token and refresh token from our DB
2. If the access token is expired, we get the valid access token with refresh token
3. If the access token is updated in step 2, we save the new access token to DB
4. With the valid access token, we fetch information from gmail

这个过程将用在 CQRS 模式中的几个命令处理程序中。

我的问题是,

  • 我应该把 DDD、CQRS 方式的逻辑放在哪里?它应该放在存储库、应用程序服务还是域服务...?

  • 我们可以从查询处理程序中调用该方法吗?我想知道这是因为那个逻辑偶尔会更新数据库中的数据,所以我认为我们不应该从查询处理程序中调用这个过程

我目前的想法是创建一个包含上述过程的 UserService。我的解决方案结构的具体例子如下。 UserService 将在多个命令处理程序中使用,并且不会在 QueryHandler 中使用,因为它偶尔会更新数据库。但是,如果基于 DDD 方式有更好的想法,我很想知道。

解决方案结构

Application layer (depends on Domain and Infrastructure)
- UserController.cs
- CommandHandlers folder (several command handlers use UserService)
- QueryHandlers folder

Domain Layer (No dependency)
- UserAggregate folder
- User.cs (Model for user)
- IRepository.cs (Interface)

Infrastructure Layer (depends on Domain)
- EF Core related folder
- Repository.cs (Implemented IRepository.cs)
- UserService.cs (has the token update process)

User.cs

public class User 
{
public string AccessToken { get; set; }
public string RefreshToken { get; set; }
public long Id {get; set;}
}

UserService.cs(只是一个想法)

public class UserService 
{
....

GetValidAccessToken(long userId)
{
var user = repository.Find(userId);
if (user.AccessToken is expired)
{
var newAccessToken = GetNewAccesstokenWithRefreshToken(user.RefreshToken);
user.AccessToken = newAccessToken;
repository.Save(user);
}
return user.AccessToken;
}
}

最佳答案

我同意@Ankit Vijay 的观点。请接受他的回答是正确的,因为我只会对此进行扩展。

您通常在需要授权访问的集成层中使用访问 token 。例如,Web API 和其他 View Controller 。消息处理程序在使用消息队列时不应公开,因此它们通常不需要授权。

据我所知,在您的案例中,您需要使用访问 token 访问外部存储以获取用户特定的数据。这意味着访问 token 可能会在尝试该操作之前过期。

在我看来,您有 3 个选择:

1) 您在初始集成点获取相关信息,例如 Web API Controller ,然后传递该数据。

2) 您传递用户名并使用某种服务帐户为用户获取访问 token ,服务帐户有权代表用户这样做,然后使用获取相关数据的访问 token 。

3) 服务帐户可能有能力为用户收集这些额外信息,在这种情况下,服务帐户将进行身份验证以获取 token ,然后为相关用户请求数据。

在我之前的一个项目中,我们必须使用 webMethods 集成服务器,后端团队在其中使用 ADFS token 。该 token 有 8 小时的有效期,并且出于各种原因,某些操作仅在该时间之后才执行。由于服务帐户在 ADFS 上具有某种形式的委派权限,因此将为用户刷新过期 token 。我没有参与该实现,但这基本上是规避问题的想法。

如果您无法让服务帐户刷新 token 或直接获取所需数据,我想选项 (1) 是您最好的选择。

关于c# - 我应该将使用 DDD 和 CQRS 方式刷新访问 token 的代码放在哪里?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59905735/

25 4 0