1.前言
前面的文章讲到,oauth支持四种授权模式:
简化模式(implicit)
授权码模式(authorization code)
密码模式(resource owner password credentials)
客户端模式(client credentials)
扩展模式(Extension)
这篇来讲讲authorization code授权模式
2.流程
用户使用oauth简化模式进行第三方登录的流程主要如下:
ResourceOwner:资源所有者,即为用户User-Agent:浏览器AuthorizationServer:认证服务器,可以理解为用户资源托管方,比如企业微信服务端Client:第三方服务
调用流程为:A) 第三方服务通过构造OAuth2链接(传参为client_id以及redirect_uri),将用户引导到认证服务器的授权页B) 用户登录(假设从前未登录)选择是否同意授权C) 若用户同意授权,则认证服务器将用户重向到第一步指定的重定向URI,同时附上一个授权码。D) 第三方服务收到授权码,带上授权码来源的重定向URI,向认证服务器申请凭证。E) 认证服务器检查授权码和重定向URI的有效性,通过后颁发AccessToken
3.代码实现
授权码模式通常需要进行两次请求从而获取token,第一次请求为/oauth/authorize,以获取授权码,之前在implicit模式介绍过这个接口的源码,主要的区别在于type不同。授权码模式下获取code的url示例如下:
http://${host}/oauth/authorize?response_type=code&client_id=${client_id}&redirect_uri=${redirect_uri}
/oauth/authorize
@RequestMapping(value = "/oauth/authorize") public ModelAndView authorize(Map<String, Object> model, @RequestParam Map<String, String> parameters, SessionStatus sessionStatus, Principal pr