一个坑

OAuth2.0统一授权,开发自己的SDK

前段时间在做OAuth2.0有关项目重构,主要是做各个平台的一站通登陆。

各个平台都有自己的sdk下载。可是平台太多,查看了几个平台的sdk,发现都是大同小异,因为都是用了Oauth2.0的授权方式。像我这种对代码有洁癖的人。就像自己做一个统一的oauth2.0授权入口。

先说下流程吧:一般Oauth2都有这么几步。

1、注册开放平台——创建网站——获取client_id和client_secret

2、获取授权链接(平台上有提供,每个平台不一样),注意,OAuth2.0的授权链接都是以https://开头。一般都是HTTP GET 方式提交参数。参数有这么几个。

client_id:之前申请的网站的client_id
redirect_uri:回调页面(如果用户同意授权,就会跳转到这个链接,这里要注意的是,很多平台在网站中必须设置和这个参数一样的链接,否则会报redirect_uri_mismatch redirect_uri不匹配这种类似的错误
response_type:这个值一般都是code
scope:权限范围(这个参数主要是提示用户要授权哪些服务,有的平台不需要填,而有的平台是必填的。这个要去看下各个平台的API了)
state:这个参数是可以被传递的,一般会传一个随机的值,用来防止CSRF跨站脚本攻击。当然也可以利用他的传递,回传一些需要的参数。这个参数一般都是可选的。

基本上就这些是标准的oauth2.0参数,其他根据不同的平台会有一些其他的选择参数。参考API。

用这些参数,拼一个url出来,并跳转到这个地址。就会弹出平台授权的页面了。

3、用户通过授权,会跳到你刚设置的redirect_uri地址。当然,会附上一个你需要的code参数和之前设置的state参数。利用这个2个参数,我们可以进一步获取关键参数token。

获取token一般都需要用curl或者socket这种方式了。先获取getToken接口地址(每个平台不一样)。参数列表:

client_id:之前申请的网站的client_id
client_secret:之前申请的网站的client_secret
redirect_uri:同之前的参数(注意:不能修改)
grant_type:一般都是authorization_code
code:上一步获取的code

把这些参数通过curl或者socket抛送到getToken的接口。用来获取token信息。一般都是用POST的方式提交。

4、如果成功,返回的一般都是json或者xml数据,数据中包含我们需要的access_token数据。到这一步,我们的工作基本完成了,剩下的就是用得到的access_token去调用各个平台的接口了。调用接口的思路,大致上和获取token差不多,就是根据API的说明,抛送相应的数据到指定的接口地址,然后返回调用成功的数据,就可以了。

PS:如果当中碰到什么问题,其实多看看回调回来的报错信息,就基本上都在了。其实类似的API开发是挺方便的。很好的处理了各个项目之间的耦合。在开发过程中,这也是一种值得借鉴的开放模式。当然,最重要也是接口调用过程中的安全问题。