如何生成 Bearer 令牌以调用远程 Web API

Posted

技术标签:

【中文标题】如何生成 Bearer 令牌以调用远程 Web API【英文标题】:How do you generate a Bearer token to call a remote Web API 【发布时间】:2014-09-11 11:56:32 【问题描述】:

我有两个站点,一个是用户登录并管理其帐户的站点,另一个是没有 UI 的站点,只不过是一个用于存储和检索内容的 API。这两个站点都使用相同的 Owin ASP.Net Identity 2.0 设置。 UI 站点出于显而易见的原因使用 cookie,而 API 站点使用 Bearer 令牌。我需要能够使用当前用户身份验证从 UI 站点调用 API 方法/url。简而言之,我需要在 UI 站点中生成一个有效的 Bearer 令牌,以便在进行 Rest API 调用时添加到 HTTP 标头中。

我正在寻找某种方法来使用“受信任的”客户端身份验证并调用 API 的 /Token url 来生成 Bearer 令牌,或者由于两个站点共享相同的代码并且用户表调用 Owin 方法来生成UI 站点代码中的不记名令牌,我可以将其传递给 API 标头,API 站点将其视为有效令牌。

如果您需要更多信息,请告诉我。

更新:请参阅下面的更新答案以及使用 oAuth 隐式流执行此操作的正确方法。

【问题讨论】:

是否有什么阻止您简单地使用 UI 网站上的 Cookie?我有一个类似的设置(MVC:Cookie Auth/Api:Basic Auth),只需检查我的 Api 身份验证中的 Cookie @PeekaySwitch 这在我们使用 MemberShipProvider 时有效,但它似乎不适用于 OAuth 令牌。 为什么投反对票?? 如果您要投反对票,请解释一下您自己。不要拒绝投票并运行...... 【参考方案1】:

我最终找到了这篇文章,并按照它的示例代码创建了我们自己的 OAuth 授权服务器。有了它,我们可以使用在我们的 UI 站点和 OAuth 服务器之间共享的可信客户端 ID 和机密代表用户请求用户令牌。

http://www.asp.net/aspnet/overview/owin-and-katana/owin-oauth-20-authorization-server

更新 1: 在对功能和事物进行了更多工作之后,我偶然发现了创建令牌的原因。在 Owin 中有一个 TicketDataFormat 类可以完成所有的魔法。它在构造函数中接受一个参数,即 IDataProtector。如果 Owin 资源服务器在其中间件选项中使用默认的 AccessTokenFormat(TicketDataFormat);与默认的 DataProtector 一起,您可以在客户端复制令牌生成。顺便说一句,默认 DataProtector 使用 MachineKey,因此您的两个 trusted 站点必须在 web.config 中设置相同的 MachineKey。所有不受信任或部分受信任的站点都应使用上面链接中提到的标准 oAuth 流程。

var protector = app.CreateDataProtector(typeof(OAuthAuthorizationServerMiddleware).Namespace, "Access_Token", "v1");
var tdf = new TicketDataFormat(protector);
var ticket = new AuthenticationTicket() ... ;
var accessToken = tdf.Protect(ticket);

更新 2: 推荐的也是唯一的方法是使用 oAuth,在客户端使用隐式流,并设置正确的范围和响应类型。

IdentityServer3 文档有非常详细的文档说明,帮助我们在很短的时间内启动并运行。特别是Getting Started: MVC Authentication & Web APIs 教程中的Calling the API on behalf of the User 部分。

【讨论】:

以上是关于如何生成 Bearer 令牌以调用远程 Web API的主要内容,如果未能解决你的问题,请参考以下文章

如何从 .net 核心客户端生成 JWT Bearer Flow OAuth 访问令牌?

对 Bearer 令牌使用 JSON Web 令牌和 Firestore 支持

Owin Web API Bearer Token 直通

如何在 Axios 中传递 Bearer 令牌

Web API OAuth Bearer Token 安全性

服务器端使用 Bearer 令牌以编程方式在 Java 中验证 Keycloak 用户