使用自定义标头重定向到外部站点 - 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 自定义标头
h:commandbutton,如何重定向到外部站点?(JSF 2)[重复]