图解前后端分离项目中OAuth授权码(authorization code)模式流程

前端:浏览器中运行的JS代码,后端:node服务 or java服务 or GO服务。

认证服务器即为提供认证服务的服务,比如QQ,某些SSO网站等。

1.为什么认证服务器返回code而不是直接返回token给浏览器?

因为安全。如果认证服务器直接将token返回给浏览器。那么黑客可以通过获取用户浏览器的token访问认证服务器对应资源服务器的资源。这就存在安全隐患。

而浏览器把code提交给应用服务器,应用服务器去换取token时,应用服务器需要提前client_secret,此时黑客没有client_secret无法成功获取token。也就无法直接访问用户在资源服务器的资源。避免发生这种安全隐患发生的可能性。

也就是说,认证服务器是认识应用服务器的。当前你把资料存储在认证服务器对应的资源服务器中,并告诉认证服务器你允许应用服务器或此资源,则资源服务器只允许“应用服务器+你的code”都正常时才会提供你的资源,这样黑客没有应用服务器的密码即使拿到了你的code也无法访问你的资源。

举个例子:

你(浏览器)在银行前台(认证服务器)将一笔黄金(你的数据,资源)存在了银行金库(资源服务器),现在你想把黄金给金铺(应用服务器)打造一个金马桶。此时你不想直接出面将黄金取出并转交给金铺,而是想让金库凭借某个凭证(code or token?)自己去取出黄金。

1.你让银行前台给你一个token,银行金库认为只要有这个token即可取出黄金,而现在出现一个劫匪(黑客),从你这里偷看了token,则劫匪也可以从银行金库取走黄金。

2.你让银行前台给你一个code,并和银行前台约定好,只能是金铺可以通过此code换取token,劫匪想通过code换取token是不行的。银行前台和金铺是认识的,因为金铺会去银行前台注册client_id和client_secret,则现在即便是劫匪拿到code也无法获取token。也就无法取出黄金。

这样就保障了我们黄金的安全。

图解前后端分离项目中OAuth授权码(authorization code)模式流程_第1张图片

你可能感兴趣的:(前后端分离,oauth,授权码,authorization)