今天面试有问到OAuth2.0 协议是什么?平时有使用,但是没有做系统的整理,借此补全下这块知识。
1、那么先说下什么是OAuth2.0?
进入auth官网首页看到这段简述 “An open protocol to allow secure API authorization in a simple and standard method from web, mobile and desktop applications.” 翻译OAuth是一种开放的协议,为桌面、手机或web应用提供了一种简单的,标准的方式去访问需要用户授权的API服务。
好了,我们看了这话还是不太明白,那么先看实际的例子如微信授权第三方应用登录,大概流程如下:
通过Oauth协议,只需要用户在授权页面授权,第三方应用就可以获取微信用户昵称、头像、openId等基本信息,再根据这基本信息在第三方服务完成登录即可以实现微信登录到第三方应用。
2、这样有什么好处?
通过用户授权允许第三方应用访问用户资源,而不需要将用户密码分享给第三方,免去用户繁琐的注册过程。
3、OAuth2.0中有哪些角色?
client(客户端):本身不存储资源,需要通过资源拥有者的授权去请求资源服务器的资源,比如:Android客户端、Web客户端(浏览器端)、微信客户端等。
resource owner(资源拥有者):通常为用户,也可以是应用程序,即该资源的拥有者。
authorization server(授权服务器):用于服务提供商对资源拥有的身份进行认证、对访问资源进行授权,认证成功后会给客户端发放令牌 (access_token),作为客户端访问资源服务器的凭据。本例为微信的认证服务器。
resource server(资源服务器):存储资源的服务器,本例子为微信存储的用户信息。
具体流程如下:
4、OAuth2.0 授权模式
4.1 授权码模式
1)用户打开客户端请求授权,客户端向授权服务器申请授权。
/token/oauth/authorize?client_id=shopXX&response_type=code&scope=app&redirect_uri=http://xx.xx/
参数说明:
client_id | 授权类型,此类型值为code |
response_type | 授权码模式固定为code。 |
redirect_uri | 授权成功后重定向URL |
scope | 申请的权限范围 |
2)授权服务器返回授权页面,用户同意授权后,再重定向到应用服务页面,并携带AuthorizationCode。
https://xxx/cb?code=SplxlOBeZQQYbYS6WxSbIA&state=xxx
3)客户端获取code之后请求到应用服务获取Access Token。
/token/oauth/token?client_id=shopXX&client_secret=gdjbcd&grant_type=authorization_code&code=hjslu9861&redirect_uri=http://xx.xx/callbac
client_id | 授权类型,此类型值为code |
client_secret | 客户端密钥。 |
grant_type | 授权类型,填写authorization_code,表示授权码模式 |
code | 上一步用户授权返回后返回的授权码,只能用一次。 |
redirect_uri | 申请授权码时的跳转url,一定和申请授权码时用的redirect_uri一致 |
4)服务端根据Access Token访问资源。
4.2 密码模式
密码模式使用较多,用户使用账户密码登录,返回令牌token,根据token访问资源。
1)资源拥有者将用户名、密码发送给客户端
https://xxxx/token?grant_type=password&username=USERNAME&password=PASSWORD&client_id=CLIENT_ID
2)客户端拿着资源拥有者的用户名、密码向授权服务器请求令牌(access_token)
3)返回access_token ,客户端根据access_token请求资源
grant_type | 授权类型,此类型值为password |
client_id | 客户端准入标识ID |
client_secret | 客户端密钥 |
username | 用户名 |
password | 密码 |
4.3 客户端模式
1)客户端根据客户端准入标识ID和密钥访问授权服务器
2)返回access_token ,客户端根据access_token请求资源
/token/oauth/token?client_id=shopxx&client_secret=jghsasds&grant_type=client_credentials
grant_type | 授权类型,此类型值为client_credentials |
client_id | 客户端准入标识ID |
client_secret | 客户端密钥 |
这种场景一般用在各系统间或者合作方系统之间的接口调用,安全级别比较低。
4.4 刷新token
获取Access Token 授权步骤和授权码差不多,授权服务器返回Access Token和 refresh_token。
当通过access_token 访问出现“Invalid Token ”,使用参数refresh_token获取最新的access_token。
请求示例
/oauth/token?grant_type=refresh_token&client_id=CLIENT_ID&client_secret=CLIENT_SECRET&refresh_token=REFRESH_TOKEN
grant_type | 授权类型,此类型值为refreshtoken |
client_id | 客户端准入标识ID |
client_secret | 客户端密钥 |
refresh_token | 早期获得更新令牌 |