OAuth大家可能都听到过,但是可能不一定说得上来具体是怎么一回事,其实我们平时应用的地方还是挺多的,不论是电脑上网也好,还是我们手机用的app也好,经常会遇到需要登录账号才能用的一些平台,这个时候我们可能没有账号,注册又很麻烦,所以很多平台现在会列出一些我们平时比较常用的一些账号,比如微信等,这个时候我们就可以选择微信来登录这个平台,即省事又方便,这个应用相信大家都有遇到过吧,这个整个流程就是OAuth协议目前应用的一种场景,我们就来说下具体这个协议的整个流程。
OAuth有1.0和2.0,目前来说主要都是2.0的,所以我们就主要说下2.0的流程。
先把开篇说的场景正式来描述下,比如我打开一个App,需要登录才能使用,此时我点击了下微信,然后我们可以看到大概有个loading加载动画之类的东西,过了会加载完成后,这个app就自动登录了,登录的用户信息就是你微信的账号,这个流程其实比较简单,我们就说下这背后大概做了哪些事情。
首先,这个app肯定会在微信平台那边注册一个账号,这样微信才会在用户请求授权的时候把信息授权给这个app,注册完了之后微信会给这个app分配一个client_id和secret, client_id是表示这个app在微信那边注册过的唯一标识,在第一次客户端向微信请求的时候会把这个带过去,从而微信会知道是谁向我进行了请求,secret则是第二次向微信请求token的时候,微信需要再次验证你身份的参数,只有以上两步的验证都通过后,微信才会给你发放token,拿到token后才会向微信请求正式的数据,下面我们先说一下第一次请求。
前面说了,当app在微信平台注册成功后,微信会分配给app一个client_id,此时当用户在登录时点击了微信的图标后,app就开始向微信发送第一次请求了,这次请求会把client_id带上,当微信接受到你的请求后,通过client_id就可以知道你是谁了,如果查到你注册的信息,就会给用户显示一个授权的页面,这个页面的名字,图标等等会是app当初注册时候留下的,用户就可以知道是谁需要授权了。
当用户点击了授权的按钮后,微信的授权页面也会向微信的后台发送请求,如果成功后就会返回给app一个code,这个code表示用户已经同意把微信的登录信息给app,此时还只是第一步,需要继续第二步的流程。
刚才第一步拿到授权的code后,接下去继续第二步请求,app的后台会拿着刚才获得的code和之前注册微信得到的secret继续向微信进行第二次请求(这个一般都是由客户端的后台向微信发送请求,由于secret都是比较保密的数据,不可能放在客户端,都需要放在服务器,所以现在说的app发请求都是指app的后端。当然前面的第一次请求由于client_id以及返回的code,如果仅仅这个泄露,后面的步骤能保证安全的话,泄露了问题也不大,所以第一次请求放在客户端也能接受),第二次请求的2个参数,一个code,一个secret,code表示用户同意授权,secret表示我是和code代表的授权对象是同一个,有了这两个验证,微信就可以确定授权的对象是正确了,没有安全问题,此时会返回给app一个token和一个refresh_token,token用来请求数据,refresh_token用来刷新token。
app的后台拿到token后,就可以向微信的api发请求了,一般是放在请求头里面,Authorization:Bearer<token>,这样的格式。
一般为了保证安全,token也都有个时效性,过了时间就失效了,所以上面说的refresh_token就是为了获取新的token,这个也是通过api向微信发送一个请求,把这个参数带上来获取。
OAuth2.0的大致流程,就是这样,其实也不是很麻烦,下面用张图来总结下。

OAuth2.0授权流程小记