如何从 Single-Page 应用程序实施 OAuth 2.0 授权码授予?

How to implement OAuth 2.0 Authorization Code Grant from Single-Page Application?

我们有一个由 ASP.NET Web API 支持的 Angular SPA,它使用 OAuth 2.0 Resource Owner Password Credentials Grant 和 Bearer Token 进行授权。 API 使用 Microsoft.Owin.Security.OAuth 实现 OAuth。

我们正在尝试与将使用 Authorization Code Grant 的 third-party 应用程序集成,以便用户可以授权它代表他们访问我们的应用程序。

我们希望授权页面成为 SPA 的一部分,但我无法弄清楚如何将授权请求从 SPA 提交到 API 并将其重定向回 third-party申请。

我试过同时使用 AJAX(与 SPA 中所有其他 API 请求一样)和常规 HTML 表单(以便重定向响应重定向页面)。

我们最初从 API 发回 JSON 响应并让 SPA 自己进行重定向,但如果出现错误,OWIN 会自动发送重定向响应;所以似乎没有任何方法可以避免重定向响应。

如果我通过 AJAX 发送请求,浏览器将自动按照服务器发送的重定向响应发送另一个 AJAX 请求,而不是重定向页面。

如果我使用常规 HTML 表单发送请求,似乎没有任何方法可以使用 Bearer Token 发送所需的 Authorization header。

我最终使用 HTML 表单并以 body 表单发送当前访问令牌。我在表单中为访问令牌创建了一个隐藏输入,并且仅在提交表单时设置它的值(以减少它被用户或恶意 script/extension 看到的机会)。

在服务器端,我们的 OAuth 代码以前只在 Authorization header 中查找访问令牌;我将其更改为还可以在请求表单 (IOwinRequest.ReadFormAsync) 中查找授权代码请求。

OAuth 代码现在向成功的授权代码请求发送重定向响应,而不是发送带有重定向 URI 的 JSON 响应。