【什么是OAuth】
OAth是一种授权机制。数据所有者授权第三方应用获取一定权限。数据所有者产生一个代替密码的令牌(token)供第三方应用使用。
比方说,我想使用QQ快捷登录一个应用,但我又不想我的账号密码泄露。那么使用OAuth2.0我登录QQ验证了自己的身份,然后QQ便发送一个token给应用,
应用登录。应用获取到token的同时,可能还会获得头像,昵称等(但密码不会泄露)
【token与密码的区别】
1.token是短期的,会过期,密码不修改不会过期
2.token可撤销,密码只能修改不能撤销
3.token有权限范围,他只能获取一定权限,而密码则是所有
【四种授权方式】
一.授权码
第三方应用首先申请一个授权码,通过授权码获取相关权限
步骤:
1.A网站提供一个B网站的链接让用户登录
https://b.com/oauth/authorize? response_type=code& client_id=CLIENT_ID& redirect_uri=CALLBACK_URL& scope=read
redirect_uri表示登录之后跳转的页面,
client_id表示请求对象
code表示是以授权码的形式
scope表示授权范围(只读)
2.用户在B网站登录之后,返回授权码
https://a.com/callback?code=AUTHORIZATION_CODE
code就是授权码
3.A网站拿到授权码之后就可以向B网站发送请求,获取令牌
https://b.com/oauth/token? client_id=CLIENT_ID& client_secret=CLIENT_SECRET& grant_type=authorization_code& code=AUTHORIZATION_CODE& redirect_uri=CALLBACK_URL
client_id和client_secret确认请求对象的身份
grant_type表示认证方式是授权码
code就是获取的授权码
4.B网站接受请求在之后,就会以json形式发送token
{ "access_token":"ACCESS_TOKEN", "token_type":"bearer", "expires_in":2592000, "refresh_token":"REFRESH_TOKEN", "scope":"read", "uid":100101, "info":{...} }
access_token就是要获取的token
二. 隐藏式
不使用授权码(没有后端接收,只在前端),直接获取token
步骤:
1.A网站提供一个B网站的链接让用户登录
https://b.com/oauth/authorize? response_type=token& client_id=CLIENT_ID& redirect_uri=CALLBACK_URL& scope=read
直接让响应的类型为token
2.登录成功之后跳转A网站
https://a.com/callback#token=ACCESS_TOKEN
这里token在URL锚点位置,而不是和上面一样附在请求头。因为锚点不会发送到服务器
但这样不安全,因为直接返回到前端,显示在锚点上面
三. 密码式
直接使用你的账号密码申请token
1.A网站提供一个B网站的链接让用户登录
https://oauth.b.com/token? grant_type=password& username=USERNAME& password=PASSWORD& client_id=CLIENT_ID
2.直接获取token,这里没有跳转,拿到token之后以json的形式使用http回应
必须对应用高度信任
四. 凭证式
试用于没有前端的应用
步骤:
1.A应用向B发送请求
https://oauth.b.com/token? grant_type=client_credentials& client_id=CLIENT_ID& client_secret=CLIENT_SECRET
2.验证通过之后,直接返回令牌
针对第三方应用,共用token
拿到token之后以后向B网站请求数据都必须在请求头带上token,
curl -H "Authorization: Bearer ACCESS_TOKEN"
【更新token】
方法:向B网站请求两个token,一个用于登录,一个用于更新
https://b.com/oauth/token? grant_type=refresh_token& client_id=CLIENT_ID& client_secret=CLIENT_SECRET& refresh_token=REFRESH_TOKEN