OAuth2
介绍
OAuth (Open Authorization),目前版本是 2.1
- 是一个关于授权的开放网络标准
- 允许用户授权第三方应用访问用户存储在其他服务上的信息
- 不需要将用户名和密码提供给第三方应用
例如,在登录百度时可以选择使用微信登录,只需要同意微信授权,百度就可以获取用户在微信上的信息,而不需要用户在百度登录页输入用户名和密码
角色介绍
- Resource Owner,资源所有者,又称“用户”(user)
- User Agent,用户代理,比如浏览器
- Third-party application,第三方应用程序,又称“客户端”(client),如例子中的百度
- HTTP service,服务提供商,如例子中的微信
- Authorization server,授权服务器,即服务提供商专门用来处理认证授权的服务器
- Resource server,资源服务器,即资源提供商存放用户资源的服务器
解决方案
授权码模式
authorization_code
申请授权接口示例:/oauth/authorize?client_id=baidu&response_type=code&scope=all&redirect_uri=https://www.baidu.com
- client_id:客户端 ID,需要在授权服务器中注册
- response_type:code 表示返回授权码,token 表示返回访问令牌
- scope:权限范围,在授权服务器配置
- redirect_uri:重定向 URI,用户授权成功后跳转
步骤:
- 用户通过代理(浏览器)访问客户端
- 客户端将用户导向授权服务器
- 授权服务器询问用户是否给予客户端授权
- 用户同意授权
- 授权服务器将用户导向客户端指定的重定向 URI,并附上授权码
- 客户端收到授权码,向授权服务器申请令牌
- 授权服务器核对授权码,向客户端发送访问令牌(access token)和更新令牌(refresh token)
- 通过访问令牌向资源服务器请求资源
- 资源服务器把访问令牌交给授权服务器进行检验(存在 IO 问题,有其他更优解)
接口示例:/oauth/token?client_id=baidu&client_secret=123456&grant_type=authorization_code&code=6rXglz&redirect_uri=https://www.baidu.com
- client_id:客户端 ID,需要在授权服务器中注册
- client_secret:客户端密码,在授权服务器中配置
- grant_type:授权模式
- 授权码模式(authorization_code)
- 简单模式(implicit)
- 密码模式(password_credentials)
- 客户端模式(client_credentials)
- code:授权码,在授权码模式提供
简单模式
implicit
密码模式
password
客户端模式
client_credentials