不少企业都在使用企业微信进行组织机构管理,同时又使用了阿里云的服务,咱们不但愿单独为每一个员工建立一个阿里云子帐号,要是可以直接使用企业微信登陆就行了。这时候如何统一用户目录和实现单点登陆就成了一个咱们须要思考的问题。html
阿里云在本身的单点登陆管理(SSO)中介绍到,能够使用 SAML 协议提供单点登陆管理,流程图以下:java
阿里云与企业进行用户 SSO 时,阿里云是服务提供商(SP),而企业自有的身份管理系统则是身份提供商(IdP)。经过用户SSO,企业员工在登陆后,将以 RAM 用户身份访问阿里云。python
暂时先不用管 SAML 是什么,下文会详细讲到,这里简单理解为一种用户身份问答协议就好了。
当管理员在完成用户 SSO 的相关配置后,企业员工 Alice 能够经过上图所示的方法登陆到阿里云。git
总结一下重要的点:IdP (身份提供商),也即企业用户,有一套本身的用户目录,至于这个用户目录具体是怎样的,你是用数据库存仍是 Excel 存,你是用帐号密码登陆仍是支持第三方社会化登陆,阿里云并不操心。重要的是你的用户目录须要和阿里云 RAM 用户身份创建一对一关系。具体到 SAML 协议,你须要把你的用户目录的用户惟一字段做为 NameID 传给阿里云,这样阿里云就可以知道该以哪一个 RAM 用户身份登陆阿里云了。github
因而咱们的问题就 Break Down 为下面几步:web
若是你对其中某一部分很了解,能够跳过对应章节。数据库
首先科普一下 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 服务。api
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
用户赞成受权以后,会转发登陆受权码给上面填写的 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。
点击左侧菜单 -> 人员管理 -> 用户,在右侧页面的列表中能够看到刚刚添加的用户,记录下用户登陆名称(xxx@xxx.onaliyun.com),随后会用到。点击对应用户条目右侧的「添加权限」。
在权限列表中选择须要赋予该帐户的权限,本教程选择「AdministratorAccess」最高权限。点击「肯定」。
进入左侧菜单 -> SSO 管理,右侧页面点击「用户 SSO」选项卡,在下方 SSO 登陆设置处点击「编辑」。
SSO 功能状态选择「开启」。点击「上传文件」,上传你的 SAML IdP Metadata。点击「确认」。
上一步在阿里云配置好了帐号,用户名为 xxx@xxx.onaliyun.com ,接下来须要将其映射到你的用户目录。方法很简单,你只须要将对应企业微信登陆用户的 NameID 设置成 xxx@xxx.onaliyun.com 便可。
这篇文章,咱们介绍了如何利用 SAML 协议将企业微信和阿里云创建起联系。总结一下,咱们一共实现了三件事情:
事实上,企业微信登陆只是某种登陆手段,你也彻底能够支持 GitHub 登陆、微博登陆、手机号验证码登陆、生物指纹登陆 ..... 任何你能想到的登陆方式均可以。
而上述这些东西,Authing 都支持,咱们有很是丰富的社会化登陆手段,除了企业微信,咱们还支持 GitHub、微信、微博、钉钉、QQ、支付宝、小程序等。
咱们还封装了简单易用的 SAML 协议,让你能够只须要填写本身简单的配置文件,就拥有一个完整的 SAML 协议实现以及一个美观易用的登陆表单:
若是你不想关心具体的技术细节,彻底能够直接使用 Authing 开箱即用的服务,将更多的精力集中到核心业务上。
欢迎体验:https://authing.cn ,让身份管理像水电同样触手可及。