OAuth2.0是什么?
OAuth 2.0 是目前最流行的授权机制,一般用来授权第三方应用,获取用户数据。
四种角色
Oauth一共定义了四种角色:
1.资源所有者(Resource Owner):用户本身
2.资源服务器(Resource Server):存储受保护的信息 (应用的一个后台服务)
3.授权服务器(Authorization Server):在成功验证用户身份,并获得授权后,给客户端派发访问资源令牌(也是应用的一个后台服务,专门用来做授权而已)
4.客户端(Client):你使用的APP(比如微信、QQ)或第三方应用(需要使用微信、QQ授权用户信息或授权登录的应用)
四种授权方式
oauth2提供4种授权方式,分别是
授权码(authorization-code)
隐藏式(implicit)
密码式(password)
客户端凭证(client credentials)
授权码(authorization-code)
这种模式应该是最常用的,且是最安全的。
应用场景
使用第三方app时授权用户信息。
流程
1.你想玩一款游戏,然后该游戏支持新注册一个用户和使用微信登录。你为了方便,选择使用微信登录。
2.此时该游戏APP后台会请求授权服务器(附上回调URL),游戏界面会跳转到微信授权页面,提示你需要向该游戏授权你的个人信息,例如用户昵称,手机号,好友信息等(这些其实就是需要做授权保护的资源)。
3.你点击确定,确认授权这些信息给该游戏
4.微信的授权服务器将通过调用游戏APP请求中的回调URL,向该游戏颁发一个授权码
5.游戏APP获取到授权码,使用授权码请求微信的授权服务器。
6.微信授权服务器确认授权码有效后,调用回调URL,返回一个可用的令牌。
7.游戏APP携带令牌向微信资源服务器请求你的微信用户信息,后续为你在游戏中提供微信好友是否在线等信息。
隐藏式(implicit)
也被称作简化模式,它与授权码模式差不多,只是少了一个使用授权码获取token的操作。不通过第三方应用程序服务器,直接在浏览器中向授权服务器申请令牌。
应用场景
由于授权码模式需要第三方应用有后台服务器的支持,但是有时第三方应用可能只有web端。这种情况下就可以使用简化模式。
流程
1.你登录一个网页,该网页需要你提供你的微信账号某些信息的授权。
2.此时该网页会请求授权服务器(附上回调URL),跳转到微信授权页面,提示你需要向该游戏授权你的个人信息,例如用户昵称,手机号,好友信息等(这些其实就是需要做授权保护的资源)。
3.你点击确定,确认授权这些信息给该网页
4.微信的授权服务器将通过调用请求中的回调URL,直接向该游戏颁发一个令牌(与授权码模式不同,此处直接给令牌,而非授权码)
5.网页携带令牌向微信资源服务器请求你的微信用户信息,提供相关服务。
密码式(password)
密码模式是用户直接将自己的用户名密码交给你所使用的APP,APP使用你的用户名密码直接换取AccessToken。
应用场景
手机APP和网站基本都是需要这种模式登陆的,非常常用。但是一般情况下,APP和网站与授权服务器、资源服务器都是同一个产品的。
不是同一个产品的例子是火车票抢票软件,这种情况其实有两个原因,一个是你信任这些抢票软件,另一个原因是12306没有开放授权码模式给第三方APP(因为12306想让大家自己抢啊,防止服务器压力过大,并且由于很多人不会使用抢票软件,这样使用抢票软件其实是破坏了公平的。)
流程
1.用户在APP或网站上输入用户名和密码
2.授权服务器验证用户名密码正确后,返回令牌给APP或网站
3.APP或网站携带令牌访问资源服务器
客户端凭证(client credentials)
应用场景
适用于内部系统之间的验证,应用维度的共享资源,不需要用户授权,适合后台服务间的认证和访问。严格来说,客户端模式并不属于oauth框架所要解决的问题,在这种模式下,已经与用户没有关系了,单纯的数据客户端以自己的名义要求资源提供商提供服务,不存在授权问题。
流程
第一步,A 应用在命令行向 B 发出请求。
https://oauth.b.com/token? grant_type=client_credentials& client_id=CLIENT_ID& client_secret=CLIENT_SECRET
上面 URL 中,grant_type
参数等于client_credentials
表示采用凭证式,client_id
和client_secret
用来让 B 确认 A 的身份。
第二步,B 网站验证通过以后,直接返回令牌。
这种方式给出的令牌,是针对第三方应用的,而不是针对用户的,即有可能多个用户共享同一个令牌。
参考链接:
https://blog.youkuaiyun.com/Huang_Ds/article/details/125533523
https://www.ruanyifeng.com/blog/2019/04/oauth-grant-types.html
https://www.ruanyifeng.com/blog/2014/05/oauth_2_0.html