基于OAuth2.0协议 第三方登录与数据同步验证设计
前段时间,公司跟别的公司签订合作伙伴,搞了一个第三方登录与数据共享同步,是基于OAuth2.0协议,现在空闲了,做一下笔记。
到github下载一个OAuth2.0的PHP类库(当然,你也可以自己写一个^-^,但个人觉得没必要造轮子),有写好Mysql与Mongodb的Demo,参考一下,然后嵌套自己的业务代码,下面是客户端与服务端的交互流程:
+-----------+ +-----------+
| | 带client_id的URL请求获取code | |
| | --------------------------------> | |
| | | |
| | 返回带 code 的URL | |
| | <-------------------------------- | |
| | | |
| | 带code的URL请求回去access_token | |
| | --------------------------------> | |
| client | | server |
| | 返回带 access_token JSON数据 | |
| | <-------------------------------- | |
| | | |
| | 带access_token的URL请求获取openid | |
| | --------------------------------> | |
| | | |
| | 返回带 openid 的JSON数据 | |
| | <-------------------------------- | |
+-----------+ +-----------+
详细的URL参数就不在上图展示了,现在说明一下上图URL请求与返回的参数作用:
在说明步骤之前,我们需要知道在真个OAuth认证过程中,我们需要三个数据表,分别是:client,code,token。
step 1:
在做第三方登录API时,要生成一个 client_id 和 client_secret 给合作伙伴,URL上还要带上什么redirect_uri之类的参数就不多说了,值得注意一点是,在URL上传值时最好带上 “加密的签名” ,防止CSRF,在返回时,再对 签名验证数据的合法性。
step 2:
通过 client_id 认证 partner,生成code,并存储在code表,还存储了code的有效期等信息,然后返回code(一般code的有效期是很短或已经请求一次就无效了)
step 3:
通过上一步返回的code,去获取令牌,去获取access_token时,一定要做签名认证(如散列值:client_id+client_secret+timestamp+code),服务端再做散列值认证,要不路由可能会出卖你了-_-!!!
step 4:
签名通过与数据认证,生成access_token,并存储在token表,还存储了access_token有效期等信息,然后返回access_token,可以把它存储起来,因为它在服务端存储是有一定的有效期,有效期设置得看开发API的人还有access_token之后的用途,可能获取其他信息有用处,例如:数据分享。
step 5:
通过 access_totken 请求获取使用第三方登录者在服务端的openid,该openid对于客户端是唯一值的,可以使用散列值 domain+uid 之类的,这一步交互请求也要做签名认证,像第三步一样。
step 6:
接收到openid,验证用户是否在平台上注册了,如果没有验证,填写注册或绑定信息。
上面是第三方登录的方案,下面说说数据共享的方案:
+-----------+ +-----------+
| | 带grant_type的URL获取refresh_token| |
| | --------------------------------> | |
| | | |
| | 返回续期的 access_token | |
| client | <-------------------------------- | server |
| | | |
| | 带access_token与openid的post请求 | |
| | --------------------------------> | |
+-----------+ +-----------+
step 1:
客户端判断 access_token 是否已经过期了,如果过期了则执行续期操作,否则step1,step2可以省略,交互需要签名验证。
step 2:
返回access_token更新原来的access_token值。
step 3:
数据开始同步,使用curl JSON交互之类的,数据交互需要签名验证,判断access_token的有效期与解密openid,获取平台的用户id