单点登录,也就是大家常说的SSO,是OA与IM平台集成里最常见的需求之一。
用户不用记两套账号密码,从钉钉或者企业微信里点一下,直接就能进OA,听起来很美好。但SSO具体是怎么实现的?原理是什么?有哪些要注意的地方?很多人就不太清楚了。
下面就把SSO的实现原理、完整流程、常见问题,都讲清楚。
先说原理。单点登录的核心思想是什么?
简单说就是:用户在一个地方完成身份认证之后,其他信任的系统,就不用再认证了,可以直接登录。
这里面有几个关键角色:
认证中心:负责验证用户身份的地方。在我们的场景里,就是钉钉或者企业微信的认证服务。用户先在IM平台登录,平台确认了"这个人是谁"。
应用系统:也就是OA。OA信任IM平台的认证结果,用户从IM平台过来,OA就认为他的身份是可信的,直接让他登录。
用户:最终的使用者。用户只需要登录一次IM平台,就能访问所有信任的应用。
为什么可以这样?因为OA和IM平台之间,事先建立了信任关系——OA知道这个请求是从合法的IM平台来的,里面的身份信息是可信的。
这个信任关系怎么建立的?通过应用ID、应用密钥、签名验证这些机制。OA用事先约定好的密钥,去验证请求的合法性,确认是真的从IM平台来的,不是伪造的。
华天动力的SSO实现,基于标准的OAuth2.0授权码模式和各平台的官方免登接口。OA与钉钉、企业微信之间,通过AppID和AppSecret建立信任关系。所有身份认证请求都经过签名验证,确保请求的合法性和身份信息的可信度。整个认证过程遵循标准的安全协议,保证身份认证的安全性。
原理讲完了,具体的流程是怎样的呢?我们一步一步来看。
第一步:用户在IM平台点击OA应用。
用户已经登录了钉钉或者企业微信,在应用列表里找到OA,点进去。这时候,IM平台的客户端会生成一个授权请求。
第二步:IM平台生成授权码。
IM平台确认用户已经登录,生成一个临时的授权码(code)。这个授权码是一次性的,有效期很短,用完就失效。
然后,带着这个授权码,跳转到OA的登录地址。
第三步:OA用授权码换access_token。
OA收到授权码之后,不是直接就相信了,而是拿着这个授权码,从服务端调用IM平台的接口,去换access_token和用户信息。
注意:这一步是服务端调用,不是前端传过来的。前端传过来的东西不可信,必须服务端自己去验证。这是安全的关键。
第四步:验证用户身份,映射OA账号。
OA拿到用户信息之后,根据用户标识(比如userid、手机号、工号等),去OA的用户表里找对应的账号。
找到了,就知道这个IM用户对应哪个OA用户。
第五步:建立OA登录会话,进入系统。
确认用户身份之后,OA建立自己的登录会话,生成自己的session或者token,然后跳转到OA的首页。用户就成功登录了。
整个过程,用户只看到"点了一下就进去了",其实后台走了五步流程。
华天动力的SSO流程,严格遵循标准的授权码模式。前端只传递授权码,OA服务端用授权码调用平台接口换取用户信息,然后根据映射规则找到对应的OA账号,建立登录会话。所有验证都在服务端完成,不依赖前端传入的身份信息,确保认证过程的安全性。
上面第四步说到了账号映射,就是IM用户怎么对应到OA用户。这个映射很重要,对应错了,就会出现A登录变成B的情况。
常见的映射方式有几种:
第一种:按userid映射。
就是用IM平台的用户ID,跟OA里的某个字段对应。比如钉钉的userid,在OA里存一个字段,登录的时候用userid来找。
优点:userid是平台唯一标识,不会变,映射稳定。
缺点:需要维护一个额外的映射字段,新员工入职要同步维护。
第二种:按手机号映射。
用手机号来对应。IM里的手机号跟OA里的手机号一样,就认为是同一个人。
优点:不用额外维护映射,手机号大家都有。
缺点:手机号可能会变,改了手机号映射就断了。而且手机号的获取可能需要额外的权限。
第三种:按工号映射。
用工号来对应。IM里的工号跟OA里的工号一致,就认为是同一个人。
优点:工号一般比较稳定,企业内部统一管理。
缺点:需要确保两边的工号都准确、一致。如果工号管理不规范,容易对不上。
具体用哪种映射方式,要看企业的实际情况。一般来说,如果组织同步做得好,userid同步过来了,用userid最稳定。如果没有同步,用手机号或者工号也可以,但要保证数据一致。
华天动力支持多种账号映射方式:可以按平台userid映射,可以按手机号映射,也可以按工号或其他自定义字段映射。企业可以根据自己的用户数据管理情况,选择最合适的映射方式。映射规则可以在后台配置,灵活调整。同时支持组织同步时自动维护映射关系,减少人工维护的工作量。
关于SSO,有几个常见的误解,这里也澄清一下:
误解一:SSO就是传个用户名过去。
不对。如果只是前端传个用户名过来,那太不安全了,谁都可以伪造。正规的SSO,必须是服务端之间的验证,前端传的只是临时授权码,真正的身份验证在服务端完成。
误解二:SSO了就不用管权限了。
也不对。SSO只解决"你是谁"的问题,不解决"你能做什么"的问题。权限还是OA自己的权限体系管,SSO登录的用户,跟正常登录的用户,权限是一样的,该有的有,不该有的没有。
误解三:SSO了就不会有账号安全问题了。
也不是。SSO只是登录方式变了,账号本身的安全还是要注意。比如IM账号被盗了,那OA也会有风险。所以IM账号本身的安全很重要,该开二次验证的开二次验证,该做设备管控的做设备管控。
误解四:所有系统都能SSO。
不一定。能不能SSO,要看两个系统之间有没有建立信任关系。OA和IM平台之间做了SSO,不代表OA跟其他系统也自动SSO了。每个系统对之间,都要单独做。
最后,选型的时候,关于SSO,要确认几个点:
第一,支持哪些登录方式?移动端免登、PC端扫码、网页端跳转,都支持吗?
第二,账号映射方式有哪些?能不能灵活配置?
第三,安全机制怎么样?是不是服务端验证?有没有防重放?授权码有效期多久?
第四,异常处理怎么做?映射不到账号怎么办?授权失败怎么办?有没有日志?
第五,跟组织同步能不能配合?同步的时候自动维护映射关系,还是要手动配?
把这些点都确认清楚,选到的SSO方案才靠谱。
单点登录看起来简单,就是"点一下就进去了",但背后的实现和安全机制,其实有不少讲究。了解清楚原理和细节,才能用好SSO,既方便又安全。