很多企业都在使用企业微信进行组织机构管理,同时又使用了阿里云的服务,我们不希望单独为每个员工创建一个阿里云子账号,要是能够直接使用企业微信登录就好了。这时候如何统一用户目录和实现单点登录就成了一个我们需要思考的问题。
阿里云在自己的单点登录管理(SSO)中介绍到,可以使用 SAML 协议提供单点登录管理,流程图如下:
阿里云与企业进行用户 SSO 时,阿里云是服务提供商(SP),而企业自有的身份管理系统则是身份提供商(IdP)。通过用户SSO,企业员工在登录后,将以 RAM 用户身份访问阿里云。
暂时先不用管 SAML 是什么,下文会详细讲到,这里简单理解为一种用户身份问答协议就行了。
当管理员在完成用户 SSO 的相关配置后,企业员工 Alice 可以通过上图所示的方法登录到阿里云。
- Alice 使用浏览器登录阿里云,阿里云将 SAML 认证请求返回给浏览器。
- 浏览器向 IdP 转发 SAML 认证请求。
- IdP 提示 Alice 登录,并在Alice登录成功后生成 SAML 响应返回给浏览器。
- 浏览器将 SAML 响应转发给 SSO 服务。
- SSO 服务通过SAML互信配置,验证 SAML 响应的数字签名来判断 SAML 断言的真伪,并通过 SAML断言的 NameID 元素值,匹配到对应阿里云账号中的 RAM 用户身份。
- SSO服务向浏览器返回控制台的URL。
总结一下重要的点:IdP (身份提供商),也即企业用户,有一套自己的用户目录,至于这个用户目录具体是怎样的,你是用数据库存还是 Excel 存,你是用账号密码登录还是支持第三方社会化登录,阿里云并不操心。重要的是你的用户目录需要和阿里云 RAM 用户身份建立一对一关系。具体到 SAML 协议,你需要把你的用户目录的用户唯一字段作为 NameID 传给阿里云,这样阿里云就能够知道该以哪个 RAM 用户身份登录阿里云了。
于是我们的问题就 Break Down 为下面几步:
- 为你的用户目录支持 SAML 协议
- 为你的用户目录支持企业微信登录
- 将你的用户目录和阿里云用户角色之间建立一对一关系。
如果你对其中某一部分很了解,可以跳过对应章节。
支持 SAML 协议
首先科普一下 SAML 是什么:SAML 全称是 Security Assertion Markup Language (中文直译为「安全断言标记语言」),从字面意义我们还看不出什么头绪。
我们从协议交互角度切入:SAML 认证流程一般都会牵涉到两方:服务提供方(SP)和身份提供方(IdP),典型的 SP 有阿里云、腾讯云以及很多很多的 SaaS 服务;IdP 其实就是我们企业自己,因为用户目录在我们这里。访问 SP 服务的时候,SP 会向 IdP 发送一个 SAML Request(具体是什么我们暂时不关心),请求 IdP 判断用户身份。IdP 收到 SAML Request 后,可以通过某种手段对用户身份进行认证,如果已登录,可以直接返回用户身份信息给 SP;如果未登录,可以弹出一个登录框,用户登录之后再将用户身份返回给 SP。SP 收到用户信息之后,再在自己的数据库里面找出对应的用户,然后以这个用户的身份访问 SP 服务。
SAML 协议的具体实现过于复杂,不建议自己从零实现,可以借助已有开源库实现,比如:
- NodeJS 的 samlify
- Python 的 python-saml
- Java 的 java-saml
一般来说,如果你作为 IdP ,需要将自己内部用户目录数据库的字段和 SAML 字段对齐,并实现 metadata 、 SingleSignOnService 和 SingleLogoutService 接口,分别实现获取 IdP 元信息、单点登录和单点登出。具体代码实现这里就不详细讲了,感兴趣的可以用开源库实现一下,或者你也可以考虑使用我们现成的 SAML 服务。
支持企业微信登录
企业微信支持两种身份认证方式:网页授权登录(指在企业微信 APP 内打开的网页,不适用于普通的浏览器网页)和扫码登录,这里我们主要讲如何接入扫码登录。
BTW: 如果你对扫码登录原理感兴趣,可以看看我们之前写的如何 从零实现扫码登录系列文章。
企业微信扫码登录流程如下:用户进入第三方网站,且这个网站支持使用企业微信登录,用户使用企业微信扫码登录之后,企业微信会将登录授权码返回给你,接着你就可以使用这个授权码换取用户信息了。
首先你需要拼接一个微信扫码登录链接,如下图所示:
https://open.work.weixin.qq.com/wwopen/sso/3rd_qrConnect?appid=ww100000a5f2191&redirect_uri=http%3A%2F%2Fwww.oa.com&state=web_login@gyoss9&usertype=member
- appid 为服务商的CorpID
- redirect_uri 为用户授权之后企业微信服务器转发授权码的地址。
- usertype 为支持登录的类型。admin代表管理员登录(使用微信扫码),member代表成员登录(使用企业微信扫码),默认为admin。
用户同意授权之后,会转发登录授权码给上面填写的 redirect_uri,你可以用它来换取用户信息:
POST https://qyapi.weixin.qq.com/cgi-bin/service/get_login_info?access_token=PROVIDER_ACCESS_TOKEN
POST 请求 body 为:
{
"auth_code":"xxxxx"
}
其中 auth_code 就是登录授权码,PROVIDER_ACCESS_TOKEN 是服务商凭证,你可以在这里看到如何获取服务商凭证。换取用户信息之后,你可以将其保持至自己的数据库。
具体的细节就不多说了,还牵涉到配置 IP 白名单,添加可信任域名等,如果你感兴趣,可以看企业微信的开发文档。当然,如果你不想自己实现,我们也提供这个服务。
用户目录和阿里云用户角色对齐
如果你实现好了 SAML 协议,你有个有一个接口可以用于下载 IdP Metadata,需要将其上传给阿里云。
在阿里云添加用户
使用你的阿里云账号登录阿里云的控制台。在你的用户头像上悬停鼠标,出现下拉菜单,点击「访问控制」。
进入左侧菜单 -> 人员管理 -> 用户,点击「新建用户」。
输入用户名称、显示名称,勾选控制台密码登录并点击「确认」。本教程中输入的登录名称是 authing,显示名称也是 authing。
点击左侧菜单 -> 人员管理 -> 用户,在右侧页面的列表中可以看到刚刚添加的用户,记录下用户登录名称([email protected]),随后会用到。点击对应用户条目右侧的「添加权限」。
在权限列表中选择需要赋予该账户的权限,本教程选择「AdministratorAccess」最高权限。点击「确定」。
进入左侧菜单 -> SSO 管理,右侧页面点击「用户 SSO」选项卡,在下方 SSO 登录设置处点击「编辑」。
SSO 功能状态选择「开启」。点击「上传文件」,上传你的 SAML IdP Metadata。点击「确认」。
在你的用户目录进行对齐
上一步在阿里云配置好了账号,用户名为 [email protected] ,接下来需要将其映射到你的用户目录。方法很简单,你只需要将对应企业微信登录用户的 NameID 设置成 [email protected] 即可。
总结
这篇文章,我们介绍了如何利用 SAML 协议将企业微信和阿里云建立起联系。总结一下,我们一共实现了三件事情:
- 接入 SAML 协议
- 接入企业微信登录
- 将阿里云 RAM 用户和自己的用户目录打通
事实上,企业微信登录只是某种登录手段,你也完全可以支持 GitHub 登录、微博登录、手机号验证码登录、生物指纹登录 ..... 任何你能想到的登录方式都可以。
而上述这些东西,Authing 都支持,我们有非常丰富的社会化登录手段,除了企业微信,我们还支持 GitHub、微信、微博、钉钉、QQ、支付宝、小程序等。
我们还封装了简单易用的 SAML 协议,让你可以只需要填写自己简单的配置文件,就拥有一个完整的 SAML 协议实现以及一个美观易用的登录表单:
如果你不想关心具体的技术细节,完全可以直接使用 Authing 开箱即用的服务,将更多的精力集中到核心业务上。
欢迎体验:https://authing.cn ,让身份管理像水电一样触手可及。