我有一个使用 .Net Core Web API Rest 服务的 .Net Core MVC 网站。Rest 客户端代码由 AutoRest 生成。
出于身份验证目的,API 有两个端点:
\token:
它将接受两个参数用户名和密码,并返回两个东西:access_token
(JWT Token)和随机生成refresh_token
的 .\token\refresh
它将接受两个参数:access_token
andrefresh_token
并返回 newaccess_token
和 newrefresh_token
。
access_token
寿命是 24 小时,
refresh_token
寿命是 5 天
让我们转到网站部分。UserController
有5种标准动作方法,Index, Details, Create, Edit and Delete
. 在第一次请求索引路由时,检索所有用户的列表。我通过向 AutoRest 生成的 API 客户端提供用户名和密码来获取令牌。
string access_token = GetAccessToken(username, password); // this will call API's \token endpoint and return access_token
HttpContext.Session.SetString("api_access_token", access_token); // put this token in session variable so it can be used for further requests.
var tokenCredentials = new Microsoft.Rest.TokenCredentials(access_token);
var api = new ApiServiceClient2.ApiServiceClientProxy2(BaseUri, tokenCredentials);
然后我可以调用我的实际请求来获取用户列表
IList<ApiServiceClient.Models.AppUser> list = api.AppUser.GetAppUser();
到这里,一个请求就完成了。
让我们转到第二个请求(详细信息路由),我正在获取特定 ID 的用户详细信息,在这里我可以从会话中检索令牌,其余部分相同,创建凭据对象并调用目标操作方法。
string access_token = HttpContext.Session.GetString("api_access_token");
var tokenCredentials = new Microsoft.Rest.TokenCredentials(access_token);// I can put this token in session variable so it can be used for further requests.
var api = new ApiServiceClient2.ApiServiceClientProxy2(BaseUri, tokenCredentials);
ApiServiceClient.Models.AppUser obj = api.AppUser.GetAppUser1(id);
同样,我可以Create, Edit and Delete
通过从会话中获取令牌并传递给 API 客户端来编写操作方法。
现在,如果我的令牌过期了,网站怎么会知道它必须通过向\token\refresh
端点发送请求来刷新令牌。此外,当刷新令牌过期时,通过将用户名和密码重新发送到\token
端点来生成新令牌。
那么使用此身份验证方案调用 API 的最佳方法是什么。我是否应该在控制器的每个操作方法中编写此逻辑(生成令牌、检查令牌到期、刷新令牌、再次检查刷新令牌到期)?显然一个合理的网站不会只有一个控制器,一个网站有10-15个控制器,每个控制器都有这5个动作方法,在每个动作方法中写同样的逻辑会很麻烦。
正如我所提到的,我已经使用 AutoRest 工具生成了 API 客户端代码。我想使用这些自动生成的模型类和 api 客户端。这使得在哪里注入这个逻辑变得更加困难。