在咱们平常开发中,一般会接入第三方的登陆,好比QQ、微信、微博等。在公司内部,也会介入公司的内网登陆。一般状况下,咱们的方案是:java
当应用检测到没有用户信息时,就会跳转到(302)第三方服务,用户在第三方服务登陆后返回应用时会带上用户的信息(Session),这就是通常状况下咱们的登陆认证过程。ajax
在先后端分离的场景下,通常作法是中间层(Node)检查用户请求的Header中是否存在用户信息,若是不存在则向第三方服务请求认证(302),认证成功后返回当前的登陆用户的信息,再进行其余业务逻辑的处理。后端
既然标题有另类一词,咱们确定不能局限于“通常作法”。在咱们的先后端分离场景中,由Node充当中间层,Java提供HTTP Restful接口,咱们场景不一样点在于第三方服务(一般是集团登陆认证服务)不支持Node接口,只提供Java接口。因此咱们必须经过 Node去请求Java,由Java去请求认证服务而后返回Node。方案以下:浏览器
看上面流程图,咱们的方案不过是在Node和Auth Server中增长了Java Server,并无其余异处。只因这个方案和通常先后端分离场景的认证不太同样,里面的须要注意的细节较多,能够记录一下。服务器
首先是用户经过url的输入,访问页面的过程,流程以下:微信
讲解以前注意:cookie
在咱们的场景中:前后端分离
Node与Java Web的Ajax要么带有效cookie,要么带tickets(一次有效)。url
咱们的页面是 http://localhostcode
浏览器经过url访问Node服务器(即页面请求),Node会检测用户的请求里面是否带有用户信息的Cookie。若是没有,则向Java Web发出用户信息的请求,因为没有有效cookie,Java Web断定当前用户未登陆,返回 {code:302, url: xxx}
。Node接收到302后,直接 redirect 到刚才的url上。这个url一般是: http://www.xxx.com?redirect=http://localhost
用户在Home(第三方登陆认证服务)完成登陆过程后,会返回咱们的localhost,而且带有tickets: http://localhost?tickets=asdfasdfasdfasdf。
第二次,咱们又回到了页面请求的步骤,同理Node检测不到用户请求中的用户信息有效Cookie,会向Java Web出用户信息的请求,不一样之处在于会带上刚才Home返回的url上的tickets。Java Web发现请求中没有cookie可是有tickets,因而拿着tickets去向Home认证,此tickets是否有效,有效Home会返回用户信息,Java Web存储此用户信息而且返回给Node。Node拿到用户信息后,当即往response里面写入用户cookie,同时redirect到/(做用是,去掉url上的tickets)。
第三次浏览器向Node发出页面请求,因为Node检测到请求中有cookie,就会直接返回页面给浏览器。以后用户的全部行为操做的ajax请求,都会带上cookie,因此都是合法的。
思考:
上面认证方案中,其实只须要发出两次页面请求,也就是访问两次 localhost。咱们第三次redirect的缘由是,去掉url的tickets。若是不去掉也没有影响,可是会出现用户手动去刷新页面的状况,手动刷新页面的tickets是不可用的,java会返回403,影响用户使用。
总结:
咱们的认证登陆方案,和传统的方案并没有差异,不过多了中间Node和Java的交互而已。须要注意的就是cookie的写入时机和tickets的去除。
原创文章,欢迎转载。转载请注明:转载自Fs21 ' s Home,谢谢!
原文连接地址:先后端分离场景下的另类登陆认证方案