这里有讲
https://stackoverflow.com/questions/13387698/why-is-there-an-authorization-code-flow-in-oauth2-when-implicit-flow-works-s大概讲的是授权服务器会重定向到你所指定的 url,但是重定向没有 body 只能通过 URL 里拼接传参数,这样带来安全问题;而客户端服务器根据授权码向授权服务器发请求,它们之间的交流可以不通过 URL 传参数,可以通过 hash 段 access Token,hash 段不属于 http 请求它只能被浏览器所识别因此不能被中间人获取
除此之外,我自己的一些看法:
1.客户端会暴露 token
授权服务器是会根据客户端传来的 redirect_url 返回给客户端 3xx 重定向状态码,然后客户端再把授权码 code 传给客户端服务器,首先前端的都是不安全的,直接将 token 传给客户端会把 token 暴露,坏人就可以获取拿来干坏事了
2.授权服务器不会直接发 token
所有授权客户都需要向授权中心注册获取 appkey 与 appscrete,其中 appkey 为公开的而 appscrete 是只有客户端与服务器可见的,更重要的是 appscrete 只能存在客户端服务器不能直接存在客户端上不然同样会暴露。
因此客户端向授权中心申请授权时会发送自己的 appkey,然后授权中心会返回授权码,经过重定向到客户端服务器,客户端服务器申请授权时要将 appscrete 一起传给授权服务器,授权服务器一一对比确认无误后才会发放 token。
如果客户端只发送 appkey 就能直接获取 token,那么所有人都可以模拟该客户端来获取 token 了,这得多可怕