用Oauth2.0做认证也有一段时间了,但是总会忘记,整理一下,备忘吧
用户在第三方应用上点击登录,第三方应用通过浏览器跳转,将用户导向认证服务器,同时向服务器传送三个必须的参数:
- client_id:必须参数,注册应用时获得的API Key。
- response_type:必须参数,此值一般固定为“code”。
- redirect_uri:必须参数,授权后要回调的URI,即认证成功后的回跳地址
此时服务器会在session中检测当前用户是否登录
- 如果已经登录,则检查用户是否对该应用授权
- 如果已经授权,直接通过浏览器跳转,重新定向到第三方应用的回调地址上,同时会传递一个code给第三方应用
- 如果未登录,跳转到认证中心的登录界面,让用户登录,写相应的session,并保存sessionID,登录完成后再检查授权情况
- 如果未授权,跳转到授权页面,询问用户是否授权,授权完成后, 重新定向到第三方应用的回调地址上,同时会传递一个code给第三方应用
第三方应用接收到code之后(通过get方式从url中获取),需要拿这个code向认证服务器换取access_token:
一般会通过post方式向认证服务器发送一下信息
- grant_type:必须参数,此值为“authorization_code”;
- code:必须参数,通过上面第一步所获得的Authorization Code;
- client_id:必须参数,应用的API Key;
- client_secret:必须参数,'应用的Secret Key;
- redirect_uri:必须参数,该值必须与获取Authorization Code时传递的“redirect_uri”保持一致。
认证服务会使用以上几个参数通过一定算法,生成三个参数
- access_token 访问api时用的token
- refresh_token 更新access_token时使用,不一定是必须,看认证服务设置情况而定
- exprise_in ,access_token的过期时间
认证服务器会将上面三个参数返回给第三方应用
第三方应用得到 access_token之后,缓存下来,在调用api的时候在url中附上access_token
认证服务器检查这个access_token是否存在,是否过期,和当前session用户是否匹配,以确认能否允许第三方应用调用该接口
------------------------->以上为通用的web server oauth认证流程,还有两种方式user-agent方式和password方式,password方式一般通过https直接向认证服务器请求access_token,通过post方式向认证服务器发送一下信息
- grant_type:必须参数,此值为“password”;
- username:必须参数,用户名;
- password: 必须参数,密码;
- client_id:必须参数,应用的API Key;
- client_secret:必须参数,'应用的Secret Key;
- redirect_uri:必须参数,回调通知地址。
认证服务器获得上述信息后,验证用户名,密码,生成access_token,refresh_token,exprise_in三个参数,直接返回给第三方应用
user-agent和websever方式差不多,只是没有code生成过程,在用户登录授权后直接返回access_token