很明显,解决上述问题,需要三个人的参与,所以每个角色之间都得存守一定的约定和规则,这一套规则就是OAuth2.0协议的规范,具体比较官方的规范大家自己去看,本文就是以白话文的方式来讲解的,不会有那种官方的条条框框。
3.1 第三网站a与qq的协议(只以qq举例子,其他都一样)
首先qq会对他上边的用户权限进行分类,比如说获取头像,获取昵称,修改昵称,读取说说,发表说说之类的权限,都会进行整理,当a网站要获取那些用户的权限的时候就会颁发给他相应的权限,当然为了确定是a网站来访问我大企鹅用户的东西,会要求a网站在qq平台上注册一下身份,比如说用client_id和client_sercret来表名a网站应用的身份,如果是b网站 想访问也要注册一下,将来qq也会知道是b网站来访问我的用户上的资源和权限。
当然,为了更加明确和安全,qq还会要求a网站注册一个地址(redirect_url)或者注册你需要获取用户的那些权限,这样一来,你来的时候,我的检查一下redirect_uri是不是你的,当你让qq的用户登录授权成功之后,我也好根据redirect_url跳回去找你啊。
3.2 用户和qq的协议
用户来进入a网站,a网站集成了“用qq登录“登录的功能,于是用户点击用qq登录,那么a网站就会带上client_id去跳转到qq的授权页面,qq一看client_id就知道是a网站来的,核对一下(通过client_id)这个a网站是qq授权过的客户端,我根据client_id找出a网站可以获取的权限,给用户显示出来,然后让用户选择你是否同意a网站获取你的这些权限。如下图,这里我以码云 的qq登录为例
我们可以看一下这个页面的地址:https://graph.qq.com/oauth2.0/show?client_id=101284669&redirect_uri=https%3A%2F%2Fgitee.com%2Fauth%2Fqq_connect%2Fcallback&response_type=code&state=f70af08d82d762a56d844e0b0f1d0b7abafd48127c5b4ee0
1. 红色部分是qq的授权地址,绿色部分是码云携带的参数,很明显码云也向qq注册了,有client_id和redirect_uri两个重要参数,redirect_uri用户同意授权后跳回去,明显是码云的一个地址。
2. response_type=code 这个参数是OAuth2.0规范,意识是授权方式为code方式,此处一般填写固定值code,因为还有其他授权方式,但是不常用,
3. state=f70af08d82d762a56d844e0b0f1d0b7abafd48127c5b4ee0 这个也是里边的规范 状态参数 值是一个随机字符串,需要qq原样返回给码云的,置于什么作用,参考好多资料,都没有明确指出,大家也只是遵守这个规范(不过肯定有用的,现在还不清楚)
注意:当用户没有同意,OAuth的授权流程就结束了。如果同意了,才继续进行。
所以这一步流程就本就是,你带着参数向qq的授权页面跳转 https://graph.qq.com/oauth2.0/show?&client_id=xxxx&redirect_uri=xxxxx&response_type=code&state=xxxx 红色部分是你需要填写的部分。大家可以参看微信网页授权就是酱紫的。
3.3 qq的处理并且返回给a网站
qq肯定是作记录啊,记录用户对码云授予了这两个权限,将来出什么问题也好做一个凭证啊,万一你来讹qq一下说,我没有授权,你怎么把我的东西给码云了。(马云:管我什么事!!)记录之后,会生成一个code码,这个code肯定是和用户的授权记录
是一一对应的,这个code码也是OAuth2.0的规范,并且这个code码有过期时间,并且只能用一次(置于为什么这么设计,先插个眼我们后边说)。然后大家可以看后续的流程: