【发布时间】:2015-07-08 20:28:39
【问题描述】:
我试图了解 saml 身份验证流程如何在客户端(基于 AngularJS)、api 服务器(基于节点和护照)和 idp 存在于不同域中的移动环境中工作。
根据我收集到的一般做法是,如果不存在身份验证(即客户端未在请求中包含不记名令牌),则让服务器向客户端返回 401。客户端了解 401 响应表示打开服务器上的登录端点。当登录端点打开时,它会向身份验证提供者发出通行证调用(将用户重定向到身份验证提供者的站点)并提供回调 URL。当用户进行身份验证时,身份验证提供者重定向到提供的回调 URL,这允许服务器从身份验证提供者的响应中检索信息并构造可以由客户端使用的某种类型的令牌(例如 JWT)(即包含在标头)在进行 REST 调用以识别自身时。
我的问题是:客户端如何从服务器获取令牌?因为我们处于基于重定向的身份验证流程中,所以我不能只在回调函数中使用return token;这只会在浏览器中显示令牌而不将其交给客户端。服务器是否只是发出指向客户端域的 302 重定向并将身份验证令牌包含在标头中?也许我不应该首先从客户端重定向到服务器,而是使用window.open() 并使用window.opener.postMessage 或者这太老式/对移动设备不友好?
This 问题讨论了针对 SAML IDP 的身份验证,但我有兴趣了解有关最后一个要点以及它如何与基于 AngularJS 的客户端一起工作的更多详细信息。
我在网上看到的许多示例要么是使用 OAuth/SAML (passport-saml-example) 的单个域,这避免了客户端存在于单独域中的问题,要么使用具有基本身份验证的两个域,从而避免了重定向到某个第三方进行身份验证的问题,但我很难找到使用我正在尝试使用的所有点点滴滴的好例子。
This 博客文章似乎非常接近我想要完成的任务(请参阅 googleSignInCallback),并且像我想象的那样使用 302 重定向,但该解决方案依赖于明确知道要重定向到的客户端 URL,这似乎可以如果我想在将来支持多种客户端类型(即本机应用程序),就会有问题。
【问题讨论】:
-
你解决过这个问题吗?
-
@Hese 是的,我很快就会包含一个简短的答案。谢谢提醒
标签: angularjs node.js authentication saml-2.0