OAuth 2.0是一种设计思路,不是一个框架
Oauth2的4种模式:
1、授权码模式(获取code、code换取access_token)
2、简化模式(直接换取access_token,基本不用)
3、密码模式(客户端像用户索取账号密码,然后客户端向服务端索取授权,基本不用)
4、客户端模式(客户端以自己的名义要求"服务提供商"提供服务;场景:提供接口服务)
Oauth2授权码模式流程
1、先注册应用,每个系统都有
client_id 应用id
client_secret 应用secret
2、注册一个用户
3、请求授权码code(换取的code其实已经标志了是哪一个用户)
http://localhost:8080/oauth2-server/authorize?client_id=client_id&client_secret=client_secret&response_type=code&redirect_uri=redirect_uri
参数说明
client_id 应用id
client_secret 应用secret
(secret肯定是不能放在url上面的,一般都会把secret当成一个秘钥对传输的参数做一个电子签名,然后到服务端验证这个签名是否合法)
response_type 返回授权码的标识
redirect_uri 回调地址
4、服务端跳转到登录页面(安全:可以做redirect_uri的域名认证,像微信登录,注册应用时保存域名),用户输入账号密码登录(或者已经登录的用户做授权操作)
5、服务端返回授权码,重定向到redirect_uri
redirect_uri?code=63910432da9186b22b1ad888d55ae8ae
6、以POST方式提交到http://localhost:8080/oauth2-server/accessToken,最终返回accessToken
client_id 应用id
client_secret 应用secret
grant_type 用于传递授权码的参数名authorization_code
code 用户登录授权后的授权码
redirect_uri 回调地址
服务端最终返回如下数据
{"expires_in":3600,"access_token":"access_token"}
7、access_token过期校验
8、access_token刷新接口
9、获取用户信息,见过很多网站,第三方登录后还要注册一次,因为他们拿到了access_token后并没有去获取用户信息,或者获取不到需要的信息,比如说手机、邮箱等信息
获取用户信息,服务端一般会返回一个唯一标志UUID、用户名、用户头像等用户信息,然后子系统录入这些信息,并把该用户信息和access_token做绑定,子系统也可以对该用户做授权等操作
为什么授权码模式需要这个授权码
因为直接返回access_token有可能被黑客拦截到,而拿到access_token就可以获得用户信息了,非常不安全。
那最容易想到的是,微博通过https返回access_token啊,https会对access_token加密,那不就可以了吗? 为什么这个方法不可行呢?
因为有可能我们的网站不支持https!站在微博的角度来看,千千万万的第三方网站,你要求每个网站都支持https,是不太现实的。那为什么返回code再去获取access_token就安全了呢?
1、用clientId换取code,这一步是跳转到了保存用户信息的应用的,比如说qq、微信、新浪等,为什么需要跳转到这个应用,因为需要获取登录用户的信息(可能保存在浏览器cookie里面),换取code后,需要重定向回用户的应用,这时候,并不是每个应用都支持https的,所以信息并不是加密的。
但是,另一个问题来了,黑客拿到了code,它也向微博发起请求去获取access_token是不是就可以了呢?
2、这是获取不到accessToken,因为获取accessToken还需要用到secret,而且,
这时候请求获取
accessToken
是https(像QQ、微信、新浪,人家肯定是支持https的),这时候是加密的,就安全了。