美文网首页
CA代理登陆

CA代理登陆

作者: 小东班吉 | 来源:发表于2019-12-06 12:42 被阅读0次

背景

客户要求通过usbkey插上自动登录我们的系统。我们的系统分为客户端,服务端

遇到的问题

  1. Usbkey插上的时候,我们需要读取到usbkey的信息,拿到用户信息才可以实现登陆。
  2. 我们的系统该如何跟usbkey通信,usbkey是硬件设备,那么我们的程序需要和usbkey通信,而我们是不能直接读取硬件设备信息,那是不是得有一个windows应用程序和我们的程序通信。
  3. usbkey的厂商暴漏出来的usbkey的api有哪些。
  4. 由于系统的复杂性,那么原来的系统改动越少越好。

已知的条件

  1. Usbkey 是同一家厂商,有之前对接过的公司实现的方案,可以借鉴。
  2. windows下ie浏览器有activex控件可以和硬件通信,那这么一来我们可以借助于浏览器达到与usbkey通信的效果
  3. 我们的客户端是基于c++写的,而服务端是web系统基于php写的,客户端登陆也是向服务端的php发送http请求。

思路如下

  1. 首先,当用户插上usbkey登陆计算机的时候,我们的客户端正常来说会自启动输入用户名/密码登陆界面(登陆界面是应用程序),向web服务发起http请求登陆,而现在我们需要客户端自动登陆,正常来说我们只需要读取usbkey的用户信息,填充上去,让客户端登陆就可以了,但问题是我们并不能直接通过客户端拿到usbkey的信息,需要借助于浏览器才能拿到。
  2. 我们希望客户端改动越少越好,这样可以减少一些不必要的麻烦,所以我们不能通过客户端打开浏览器,那么就需要一个第三方的应用程序打开浏览器。
  3. 那么在什么时候打开浏览器呢,应该是在客户端发起登陆的那一刻,我们的第三方调起浏览器,这个时候我们通过activex控件就可以拿到用户信息了,那么拿到用户信息,可以直接在网页里登陆web系统。
  4. 我们的目的是让客户端登陆,现在拿到用户信息在web上登陆成功了,也就是说用户名验证通过了,那么客户端怎么知道呢,打开浏览器是第三方应用程序打开的,所以这个时候就需要登陆web网页成功的时候,通知第三方应用程序,我登陆成功了,第三方应用程序收到登陆成功的请求的时候,再通知客户端,你登陆成功了,但是呢,客户端这个时候是并没有登陆的,怎么才能让登陆成功呢?
  5. 客户端要知道是否登陆成功了,只能跟之前一样再去登陆一次,只不过这次客户端不需要再验证用户名密码了,因为在浏览器那一步已经验证通过了。
  6. 还有一个问题,就是在客户端登陆的那一刻第三方应用程序需要拦截住登陆请求,等待网页验证通过后,再实际向服务端发起真正的登陆请求。
  7. 那么现在基本上整个方案已经明了了。

解决方案

我们有一个第三方程序,暂且称为agent,客户端(client),服务端(server)

  1. agent进程监听客户端是否需要登陆,以及等待网页登陆成功的通知。
  2. agent收到client登陆的请求后,客户端阻塞等待通知,agent调起浏览器,打开登陆的网页地址,读取usbkey信息。
  3. 获取usbkey用户信息后,携带用户信息,向server端发起请求登陆。
  4. server端验证用户信息是否正确,返回登陆成功结果。
  5. agent收到网页登陆成功的通知后,代理client端向client原来的登陆请求地址,发起登陆请求
  6. agent请求成功后(这一步已经不需要验证用户信息了),告知客户端登陆成功的结果。

大致流程图

ca登陆流程图 (1).png

暂且记录下思路,回头有时间了,上代码。

相关文章

网友评论

      本文标题:CA代理登陆

      本文链接:https://www.haomeiwen.com/subject/nrzsgctx.html