我该如何在REST API + SPA应用程序中使用SAML登录?

8
我想为一个带有REST API的单个Web应用程序使用SAML登录。我该怎么做呢?通常,例如使用Google/Firebase的OAuth:
  • SPA调用Google进行登录。Google返回Google ID令牌
  • SPA可以使用Google ID令牌调用服务器,服务器可以验证Google并返回用于应用程序的访问令牌
首先,这样做是否正确,或者我到目前为止做错了什么?
但是对于SAML,据我所见,它的用户被重定向到SAML IDP,然后SAML IDP会将用户重定向到服务器声明URL。由于存在此重定向,我该如何在REST的上下文中使用它?虽然我不熟悉SAML,但我没有看到令牌。服务器只是获得陈述性信息而已?

你已经得到了你的问题的答案吗? - Khanh Le
2个回答

6
以下是当应用程序使用SAML进行身份验证时发生的事件序列:
  1. 服务器应向客户端发送带有指向SAML IDP的URL的响应。
  2. 客户端应用程序将浏览器重定向到SAML IDP (1)。
  3. 经过成功身份验证后,SAML服务器将带有重定向回客户端的响应。浏览器自动将HTML表单SAML服务器发布到您的服务器。
  4. 在验证SAML断言并进行成功授权后(可以使用用户信息或其他属性来授权用户使用您的应用程序),您的服务器应生成一个令牌,现在客户端应用程序可以使用该令牌。
这是一种基本情况。
请参见spirng-saml项目,您可以尝试和玩具样品Web应用程序。 https://projects.spring.io/spring-security-saml

1
我认为你的评论没有回答提问者的问题。在第4步中,生成令牌后,由于浏览器仍然停留在SAML IDP页面上,服务器如何将令牌发送回客户端应用程序? - Khanh Le
@LittleZero 使用302重定向。 - domsen123

1

SAML断言是Google在OpenID Connect 1.0中使用的id_token的等效物。SAML中没有access_token。SAML是一种身份验证协议。

使用access_token的OAuth 2.0是一种授权协议。这就是为什么它提供了一个access_token来授权访问您的REST API。

OpenID Connect是OAuth 2.0的扩展,支持用户身份验证以及API授权,并引入包含用户信息的id_token。

在单页应用程序与REST API中使用SAML的选项之一是将它们托管在同一域中。在这种情况下,您可以:

  1. 从SAML身份提供者获取断言。
  2. 在服务器端验证它(格式、签名、生命周期等)。
  3. 在响应中返回一个会话cookie,以在浏览器中设置它。
  4. 每个对REST API的请求都将带有授权访问它的会话cookie。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接