使用自定义标头重定向到外部站点 - AngularJS/OAuth

Posted

技术标签:

【中文标题】使用自定义标头重定向到外部站点 - AngularJS/OAuth【英文标题】:Redirect to an external site with custom headers - AngularJS/OAuth 【发布时间】:2015-10-21 03:43:45 【问题描述】:

使用自定义标头重定向到外部站点(OAuth 服务器)以验证用户身份是否有意义?

例如,在将您的凭据提供给http//this_is_my_site/login 后,您单击登录,并将您重定向到外部地址http://OAuth_Server/oauth/autorize 以授权您的客户。

问题是http://OAuth_Server/oauth/autorize 需要您刚刚在http//this_is_my_site/login 中输入的相同凭据。

如何使用自定义标头重定向到 OAuth 服务器,或者这是一种不好的方法?

headers: 
  Authorization: "Basic " + btoa('user' + ":" + 'password')

我使用 AngularJS 作为前端,使用 Spring 作为后端。

【问题讨论】:

听起来你在做 OAuth 错误。您应该只在授权主机上输入凭据 hmm,我很难真正理解如何将 OAuth2 与现有应用程序集成......所以你说登录页面应该托管在 http://OAuth_Server 而不是 @987654328 @网站? 阅读一下~aaronparecki.com/articles/2012/07/29/1/oauth2-simplified 【参考方案1】:

你的问题有两个方面。

首先是实施 OAuth。基本上,您将客户端重定向到另一端,但重定向具有指向您网站的反向链接。当客户端在另一个站点上进行身份验证(登录)时,服务器将客户端重定向回您的站点(使用您的站点在第一次重定向中提供的 url)并为您的站点提供 TOKEN(在 GET 参数中)。使用此令牌,您可以向另一个站点发送请求并检查用户操作系统是否正常。

我已经简化了一些步骤,但总的来说,就是这样。

在您的情况下,即使用户似乎拥有相同的凭据,重要的是他仍然需要在提供商上进行身份验证(授权您的网站)。没有办法解决这个问题,因为它是故意设计的,客户端不应该能够在您的站点上输入另一个站点的凭据,并且仍然可以访问其他站点的数据。

其次,在重定向时将自定义标头发送到另一个站点。这是不可能的,主要是因为这是一个历史限制。最初重定向是通过将 Location 标头发送到带有新 URL 的客户端和客户端通过 GET 请求新资源来发生的。就如此容易。后来 AFAIK 添加了 javascript 重定向,没有人真正关心标头,因为无论如何都不可能,所以为什么要麻烦呢?

但是,此规则有一个重要的例外 - 身份验证。您可以在 URL 中将用户名和密码添加为http://user:password@host/...,它们将在 Authenticate 标头中发送。但是,它与 OAuth 没有任何共同之处,被称为 HTT 基本身份验证。如果服务器支持,可以在重定向时指定,但与 OAuth 正交。

【讨论】:

哇!现在很清楚了。登录(授权)应始终在 UAA 服务器中,而不是在客户端中。

以上是关于使用自定义标头重定向到外部站点 - AngularJS/OAuth的主要内容,如果未能解决你的问题,请参考以下文章

使用 java servlet 在重定向响应中丢失 HTTP 自定义标头

获取 API、自定义请求标头、CORS 和跨域重定向

h:commandbutton,如何重定向到外部站点?(JSF 2)[重复]

Angular 2 - 重定向到外部 URL 并在新选项卡中打开

将 Cordova webview 重定向到外部站点

无法在发送 HTTP 标头之后进行重定向