如何在移动应用程序中使用 SAML 身份验证?

How to use SAML authentication in a mobile application?

我正在尝试了解 saml 身份验证流程如何在客户端(基于 AngularJS)、api 服务器(基于节点和护照)和 idp 存在的移动环境中工作在不同的域上。

据我所知,如果不存在身份验证(即客户端未在请求中包含不记名令牌),一般做法是让服务器 return 向客户端发送 401 请求。客户端理解 401 响应表示打开服务器上的登录端点。当登录端点打开时,它会调用身份验证提供程序(将用户重定向到身份验证提供程序的站点)并提供回调 URL。当用户进行身份验证时,auth 提供程序重定向到提供的回调 URL,它允许服务器从 auth 提供程序的响应中检索信息并构建某种类型的令牌(例如 JWT),客户端可以使用该令牌(即在进行 REST 调用以识别自身时包含在 headers) 中。

我的问题是:客户端如何从服务器获取token?因为我们处于 redirect-based 身份验证流程中,所以我不能仅从回调函数中 return token;这只会在浏览器中显示令牌,而不会将其交给客户端。服务器是否仅发出指向客户端域的 302 重定向并将身份验证令牌包含在 header 中?也许我不应该首先从客户端重定向到服务器,而是 window.open() 并使用 window.opener.postMessage 还是太旧了 fashioned/mobile-unfriendly?

This 问题讨论了针对 SAML IDP 的身份验证,但我有兴趣了解更多关于最后一个要点的详细信息以及它如何与 AngularJS-based 客户端一起工作。

我在网上看到的许多示例要么是使用 OAuth/SAML (passport-saml-example) 的单个域,这避免了让客户端存在于单独域中的问题,要么使用两个域基本身份验证,它避免了重定向到某些第三方进行身份验证的问题,但我很难找到使用我尝试使用的所有点点滴滴的好例子。

This 博客 post 似乎非常接近我想要完成的(参见 googleSignInCallback)并像我想象的那样使用 302 重定向,但该解决方案依赖于明确了解客户端 URL 重定向到,如果我想在未来支持多种客户端类型(即本机应用程序),这似乎有问题。

最终,我能够通过让我的应用程序打开浏览器 window(Cordova 的 InAppBrowser)到支持 SAML 的应用程序,让该应用程序完成正常的 SAML 流程,然后完成 SAML 来共同解决这个问题-enabled 应用程序生成了一个 JWT。然后,我的移动应用程序能够使用 InAppBrowser 的 executeScript 功能从浏览器 window 中提取 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

希望这对其他试图处理此问题的人有所帮助!