角色
- 资源所有者(Resource Owner):通常是用户,如昵称、头像这些资源的拥有者(用户只是将这些资源放到服务提供商的资源服务器中)
- 第三方应用(Client):希望使用资源服务器提供的资源
- 认证服务器(Authorization Server):专门用于对资源所有者的身份进行认证,对要访问的资源进行授权、产生令牌的服务器。访问资源需要通过认证服务器由资源所有者授权才可以访问
- 资源服务器(Resource Server):存储用户的资源,验证令牌有效性。比如:维系资源服务器存储了微信用户信息
- 服务提供商(Service Provider):认证服务和资源服务归属于一个机构,该机构就是服务提供商
授权码模式(Authorization Code)
OAuth在第三方应用和服务提供商之间设置一个授权层,第三方应用不能直接登录“服务提供商”,只可以通过授权层将“第三方应用”和“用户”区分开来。“第三方应用”通过授权层获取令牌(AccessToken),获取令牌后通过令牌去访问服务提供商。令牌和用户密码不同,可以指定授权层令牌的权限范围和有效期,“服务提供商”根据令牌的权限范围和有效期,向“第三方应用”开放用户对应的资源。
工作流程:
- 第三方应用向认证服务器请求授权
- 用户告知认证服务器同意授权(通常是通过用户扫码或输入“服务提供商”的用户名密码的方式)
- 认证服务器向第三方应用告知授权码(code)
- 第三方应用使用授权码(code)申请Access Token
- 认证服务器验证授权码,颁发Access Token
简化模式(Implicit)
密码模式(Resource Owner Password Credentials)
将用户和密码传过去,直接获取Access Token,用户同意授权动作是在第三方应用上完成,而不是在认证服务器,第三方应用申请令牌时,直接带用户名和密码去向认证服务器申请令牌。这种方式认证服务器无法判断用户是否真的授权,用户和密码可能是第三方应用盗取的
工作流程:
- 用户向客户端直接提供认证服务器想要的用户名和密码
- 客户端将用户名和密码发给认证服务器,向认证服务器请求令牌
- 认证服务器确认后,向客户端提供访问令牌
客户端模式(Client Credentials)
当一个第三方应用自己本身需要获取资源,而不是获取用户资源时,客户端模式十分有用
工作流程:
- 客户端向认证服务器进行身份认证,并要求一个访问令牌
- 认证服务器确认后,向客户端提供访问令牌