我正在尝试了解saml身份验证流程如何在移动环境中工作,其中客户端(基于AngularJS),api服务器(基于节点和护照)和idp存在于不同的域中。
从我收集的内容来看,一般的做法是让服务器在没有身份验证的情况下向客户端返回401(即客户端在请求中没有包含承载令牌)。客户端了解401响应表示在服务器上打开登录端点。打开登录端点后,它会向auth提供程序(将用户重定向到auth提供程序的站点)进行护照呼叫,并提供回调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,这似乎是如果我想在将来支持多种客户端类型(即本机应用程序),则可能会出现问题。
答案 0 :(得分:3)
最终,通过让我的应用程序打开浏览器窗口(Cordova的InAppBrowser)到启用SAML的应用程序,让该应用程序完成正常的SAML流程,然后启用SAML的应用程序生成JWT,我能够一起工作解决方案。然后我的移动应用程序能够使用InAppBrowser的executeScript功能从浏览器窗口中提取JWT字符串。然后我可以将JWT字符串传递给我的API服务器,该服务器能够验证JWT是否已正确签名和信任。
在我实现我的解决方案后,我发现github上有类似的功能:
https://github.com/feedhenry-templates/saml-service
https://github.com/feedhenry-templates/saml-cloud-app
https://github.com/feedhenry-templates/saml-cordova-app
希望这有助于其他任何人试图解决这个问题!