随着公司规模越来越大,员工需要使用的产品矩阵也会越来越丰富,不仅包括内部的 IT 系统,OA 系统,业务系统,还会有很多和外部产品集成的登录流程,更别提各种业务系统或者子系统中的账户体系了。如果使用简单粗暴的方法,让员工在每一个系统中单独注册一个独立的账户,不仅员工的用户体验简单粗暴,也会陡然提升员工密码管理的相关成本。
在开始本篇文章之前,我想先与大家聊聊,什么是账户体系认证。
不论是在哪个产品中登录自己的账户,你可能都需要通过输入自己的手机号,用户名,邮箱或者工号的方式登录到这个产品之中(扫码其实也是一种方式)。但是在这个过程中我们为什么需要输入自己的相关信息呢?
其实在这个过程中我们主要是为了解决以下三个问题:
这三个问题是非常重要的,因为他们构成了在账户体系中身份认证和授权的基础要素,我们先尝试来分别解答这三个问题:
这个问题关注的是用户或系统的身份标识。在一个服务端账户体系中,你需要确保每个用户或系统都有一个唯一的标识符,通常是用户名、电子邮件地址、用户 ID 或其他独一无二的信息。这个标识符用于识别和区分不同的实体。身份验证的第一步就是验证这个标识符是否有效,并确定它对应的用户或系统。
这个问题涉及到用户或系统被授予了什么操作或资源访问权限。权限可以分为多个级别,从只读权限到完全控制权限等。在服务端的账户体系中,通常会使用角色(roles)或权限组(permission groups)来管理权限。用户或系统被分配到一个或多个角色或组,每个角色或组都定义了一组具体的权限。确保在身份验证后,根据用户或系统的角色或组确定其可访问的资源和执行的操作。
这个问题关注的是用户或系统的组织隶属关系。在许多应用中,用户可能属于一个或多个组织,这些组织可以是公司、团队、部门等等。组织通常用于管理资源的访问和共享,以及确定用户在组织内的角色和权限。确保你的账户体系可以处理多个组织和用户在这些组织之间的关系,以便正确授权和限制资源访问。
我们处理账户体系的主要任务是确保系统中的账户、角色权限、组织等信息与需要集成的系统中的相关字段能够协同工作,以实现身份验证和授权功能。业界中已经有非常专业的问题解决思路了,比如这几种方法:
SSO 是一种常见的解决方案,允许用户在多个系统之间使用单一的身份验证凭据进行登录。通过使用标准协议(例如 OAuth、SAML、OpenID Connect 等),我们就可以将账户体系与需要集成的系统相连。在连接完毕之后,一旦用户登录了一个系统,他们就可以无需重新登录访问其他系统。
我们也可以设计一组 API,用于管理用户、角色、权限和组织等相关信息。这些 API 可以用于创建、更新、删除用户帐户、分配角色、分配权限以及管理组织结构。其他系统可以通过调用这些 API 来实现与账户体系的互操作。
有些特殊的系统可能会存在一些当前业务中所需要的业务字段,因此我们还需要考虑通过数据同步和字段映射可以用来维护不同系统之间的一致性。通过定期同步用户、角色、权限和组织等数据,确保它们在不同系统中保持一致。当然,数据同步的前提是我们需要根据定义字段映射规则,以确保不同系统中的数据可以正确匹配。
如果可能的话,我们也能够尝试去建立一个中心化的身份管理系统,这个系统负责管理所有用户、角色和权限。其他系统可以与这个中心化系统进行集成,以便统一管理身份信息。这种方式可以减少数据不一致性的问题,并简化维护。
当然,不论我们最终选择了哪一种账户体系对齐的方法,都需要考虑能够在与自有业务体系集成以外,提供足够的代码与业务审计机制,以便用于应付后续可能的审计与日志留存能力,万一在出现任何异常或未经授权访问时查证对应的问题。
正如同上文所说,我们在向一些私有化客户提供相关服务时,会分别采用“数据同步”或“实时校验”的方式解决账户体系对齐。当然由于不同客户的业务环境与内部业务水平不一,我们也分别整理出了两种方式的优势,以及需要考虑的相关风险。
这种方式需要客户基于 FinClip 提供的 OpenAPI 与相关服务,将对应的账户信息同步在我们所提供的服务之中,最终通过统一的账户体系完成账户鉴权与登录操作。
这种方式具有这些优势:
当然,采用这种方式我们也需要考虑这些风险:
这种方式需要 FinClip 通过客户提供的账户接口完成账户校验的相关工作,在获得账号相关信息后完成登录。
这种方式具有这些优势:
当然,选择这种方式我们也需要考虑这些风险:
总的来说,选择哪种方式取决于客户自有业务或 IT 系统中的需求和系统架构。假如说对实时性要求较高,就可以考虑“方案一,实时校验”。如果性能和可用性更重要,或者需要处理大量数据,“方案二,数据同步”可能更合适。
当然,在我们的实际经验中,也发现有一些客户没有选择标准协议进行对接,而是基于自有的业务场景和能力封装了一套“非标账户协议”。但不论选择标准协议还是非标准协议,这里的对接思路都差不多,即:
accountID
唯一标识(基于 OAuth/SAML/OIDC 对接)token
/账密/客户使用 API 先行创建接口通常,在实际应用中,可以综合考虑两种方式的优缺点,或者根据不同的用例选择不同的集成方式。最重要的是确保数据的一致性、安全性和可用性。
在我们聊完了管理后台中的账户对齐方式后,也不妨来聊聊在“小程序业务”中,用户账户对齐的常见问题吧。
由于小程序大多时候都会作为某个宿主 App(或设备) 中的功能模块存在,因此在小程序中的登录方式一般都会基于宿主 App(或设备) 中的账户进行修改,并不会在小程序中再次出现和 App 中一模一样的登录页面。
在我们熟知的微信小程序中,一般会在小程序端调用 wx.login
获取用户 code,然后再通过服务端验证的方式调用。
在 FinClip的场景中我们也提供了丰富且灵活的用户授权方式供不同类型的开发者选择,不论哪种开发者都能够基于 FinClip 获得灵活的小程序账户对齐能力。
服务端改造的使用场景主要是“客户基于 FinClip 打造自有小程序生态,但无法具备小程序的代码管控的相关能力”,在这种情况下使用服务端改造的方式较为适宜。
在这种情况下,客户需要在以下环节中投入相关的改造成本:
wx.login
方法,按照微信小程序的格式返回 code
;code
发送给开发者的服务器;code
可判断登录来自 FinClip 平台,从 code
中解析出 UserID
,返回自身账户体系的内容即可。服务端改造与微信授权集成的场景主要适用于“客户通过 FinClip 完成原有 App 中相关功能的拆分。实际工作过程中所有的小程序都是由自有研发团队进行修改与集成的。”
在这种情况下,客户需要在以下环节中投入相关的改造成本:
wx.login
,唤起微信授权后即可取得返回 code,此时可能需要对 code 拼接唯一标识;OpenID
,查询登录态返回;请注意由于微信限制不同主体,不同开放平台下的OpenID
是不一致的,此时小程序需要关联到同一主体,或者同一开放平台(此时唯一标识为UnionID
)。
小程序改造的使用场景主要是客户目前已经有可用于生产环境中的小程序,但需要对小程序中的内容进行逻辑修改,增加环境变量的方式(比如通过 wx.login
或类似 wx.loginFinClip
之类的自定义 API)进行判断(当然,这种情况下也需要具备小程序代码编辑的能力)。
这种情况下,主要需要在自有 App 中通过自定义 API 注入 wx.login
来获得当前用户的登录态。
基于上述方案三,我们也提供的一些对应的示例代码供您参考。