oauth:login

使用 企业QQ 登录

功能概述

很多公司都有内部网站,使用企业QQ登录功能,可以使得员工可以使用企业QQ的帐号和密码,就登录到公司的内部网站上。

要实现此功能,需要做的只是,加入一个“使用企业QQ登录”的按钮,像下图的样子:

其他的设计请参考附件: buttons.zip

员工通过点击此按钮,会打开登录框,并键入用户帐号和密码,验证成功后,会跳转回企业内部网站,并携带登录票据,实现登录。

本文档后续,将介绍该功能的原理和实现步骤。

基本原理

如上图示,展示了“使用企业QQ登录”功能的整个用户登录流程图,从流程图中,我们也可以看到,实现这个功能,有几个前提条件:

  1. 公司内部,员工是可以访问外网的,至少应该可以访问企业QQ开放平台服务器,域名为 openapi.b.qq.com
  2. 公司内部网站的服务器,应该是可以访问外部网络了的,至少可以访问企业QQ开放平台服务器
  3. 需要使用企业QQ登录的网站,应该在页面上,插入一个“使用企业QQ登录”的按钮
  4. 步骤6,将会由企业QQ开放平台服务器给用户浏览器发送跳转请求,跳转到企业内网的网址,该网址应该在企业QQ账户中心中注册,以防止企业员工资料被恶意攻击

实现方法

首先在您的内部网站的登录页面,嵌入使用企业QQ登录的按钮,嵌入代码为:

<a href="https://openapi.b.qq.com/oauth2/authorize?app_id=<app_id>&oauth_version=2&response_type=code&redirect_uri=<redirct_uri>&ui=web&state=<state>
    <img src="http://path/to/login/image/login.png" />
</a>

其中,app_id 要填写您自己的 App ID,redirect_uri 要填写您在企业账户中心登记的“员工登录回调地址”。

这样,页面上,就会出现一个“使用企业QQ登录”的按钮。

当用户点击按钮后,会跳转到企业QQ开放平台的登录页面,输入企业QQ帐号和密码校验后,会跳转到 redirect_uri 指定的网址。

例如,假设 redirect_uri = http://www.company.com/bqq/login ,则企业内网Web服务器会收到如下用户请求

GET /bqq/login?code=xxxxxx&state=xxxxxxx HTTP/1.1
HOST: wwww.company.com

此时,企业内网服务器的相应CGI的业务逻辑,应该这样实现,首先校验state参数是否正确,其次,取出code参数,然后调用

https://openapi.b.qq.com/oauth2/token

获取此员工的access_token,如果企业QQ开放平台服务器,正确返回了token,就认为员工登录成功了。这个步骤相当于上图中的步骤7。

关于此请求的调用方法,请参考文档

关于 state 参数的说明

在上述图示中,步骤1和步骤2,是用户和企业内网服务器交互的过程,但是步骤3和步骤4过程中,用户并没有继续和企业内网服务器通信,直到步骤6,用户才再次通过浏览器的跳转指令和企业内网服务器再此通信。那么企业内网服务器其实无法判定发起步骤6请求的用户,和发起步骤1请求的用户是否同一个人,这样就给了攻击者可乘之机。

所以,在步骤2中,内网服务器返回给用户页面后,可以在生成“使用企业QQ登录”按钮的链接时候,将用户此次会话的标识信息,放入state参数,这样当用户跟随着浏览器指令发起步骤6的时候,企业内网服务器,就可以使用state参数来校验该请求是否与发起步骤1的用户是同一个用户。企业QQ开放平台服务器会原样返回该参数。

整个过程中,企业QQ开放平台服务器的功能,并不依赖state参数的功能,所以,其设立的主要目的,就是帮助第三方接入方,能够防范跨站脚本攻击(CSRF)。

oauth/login.txt · 最后更改: 2016/04/22 16:55 (外部编辑)