使用CUBA支持的React作为前端框架的话,还能不能用IDP作为子系统实现单点登录呢

如题,使用CUBA支持的React作为前端框架的话,还能不能用IDP作为子系统实现单点登录呢

不能直接用了。
CUBA IDP的大概逻辑是:

  1. SP打开,SP重定向到IDP服务器;
  2. IDP服务器读自己的idpSession,如果存在,则把idpSession对应的用户信息返回SP;如果不存在登录信息,则展示登录页面,用户输入用户名密码登录;验证成功后;IDP保存idpSession信息,返回给SP;
  3. SP的系统里也有user数据,SP拿到用户信息后,会自动创建好session,用户登录。

所以如果使用React的话,还想用IDP,SP这里需要改造一下。

建议先看下目前CUBA IDP跳转逻辑;然后考虑React怎么做。

几个有关IDP的http请求(有些是不允许跨域的):
/idp/auth :IDP 验证用户名密码,返回一个ticket
/idp/service/activate:SP拿到上一步的ticket以后,调用这个接口激活ticket,返回用户信息;SP拿到这个以后就可以认为用户登录了。
/idp/service/ping: ping一个idpSession是否有效。
/idp/logout: 退出。

但是,因为React访问后台是需要token的;想改造的话大概逻辑是:

  1. SP重定向到IDP,IDP返回ticket。
  2. 调用SP的接口/rest/v2/idp/token: 用上一步的ticket调用SP的这个接口,拿到token,这个token从哪个SP拿的,就只能访问哪个SP的数据。
    这一步用到了IdpToken功能,但是这块有bug,是如果启用idpToken功能后,普通resttoken就不管用了。https://github.com/cuba-platform/idp-addon/issues/14

这个步骤如果你有原生开发的手机端,就不能用了,因为IDP端用到了cookie,手机端就建议保存用户名密码,自动调用/idp/auth吧。

还有这两个相关帖子建议看下:


IDP的文档:

感谢,我们这边是想用React开发PC端,改造的话我还有几点困惑:
1、第一步IDP返回的ticket是直接返回到SP的后台吗?如果用React的话,是不是只需要加一下前台的跳转就能实现这个过程?
2、第二步是去激活第一步的ticket,如果用react的话,就是用IDPtoken这个接口代替了之前的activate接口,这么理解对吧?
3、第一步的ticket,sp接到后需要先传给sp的react前台,然后再从前台去请求sp后台,返回一个IDPToken,这么理解对吗?如果对的话,返回IDPtoken的过程是已经认为用户登录了吗?还是说仍然要用传统restToken的方式,react前台请求的时候在header中带上IDPToken,SP的后台接口进行校验?
4、关于您提到的bug,IDPToken是否能代替普通RestToken进行使用?我们的SP端是作为子系统集成在已有的IDP系统中,应该是不需要再从React前端做登录、权限等操作了

  1. 第一步跳转就可以,cuba的实现就是做了跳转。
  2. 对,拿到ticket后用ticket取idpToken; cuba的IDP核心就是SP每次登录的时候都去IDP拿一个ticket;IDP依据cookie中的信息判断当前IDPsession是否还有效,是否弹出登录页; 一个ticket被activate之后就失效了(只能用一次)。
  3. SP跳到IDP,IDP再跳回来以后ticket是被前端拿到还是后端拿到我目前不确定; 但既然是前端跳转的应该是返回前端了,这时候前端自己用ticket访问SP拿idpToken就行。如果是后端拿了ticket,后端怎么知道返回这个ticket给哪个前端呢?这块先试试吧。
    拿到IDPToken就和拿到cuba正常的resttoken一样了;表示用户已登录;使用idpToken和使用resttoken方法一样的。
  4. IDPToken可以跟RestToken一样用。

最后还是建议先捋一下cuba目前的逻辑,F12 + 看源码验证一下我说的流程。上面的方案是根据已知的逻辑推测的,还没有人实践过。 加油~~

1赞