背景
客户要求通过usbkey插上自动登录我们的系统。我们的系统分为客户端,服务端。
遇到的问题
- Usbkey插上的时候,我们需要读取到usbkey的信息,拿到用户信息才可以实现登陆。
- 我们的系统该如何跟usbkey通信,usbkey是硬件设备,那么我们的程序需要和usbkey通信,而我们是不能直接读取硬件设备信息,那是不是得有一个windows应用程序和我们的程序通信。
- usbkey的厂商暴漏出来的usbkey的api有哪些。
- 由于系统的复杂性,那么原来的系统改动越少越好。
已知的条件
- Usbkey 是同一家厂商,有之前对接过的公司实现的方案,可以借鉴。
- windows下ie浏览器有activex控件可以和硬件通信,那这么一来我们可以借助于浏览器达到与usbkey通信的效果
- 我们的客户端是基于c++写的,而服务端是web系统基于php写的,客户端登陆也是向服务端的php发送http请求。
思路如下
- 首先,当用户插上usbkey登陆计算机的时候,我们的客户端正常来说会自启动输入用户名/密码登陆界面(登陆界面是应用程序),向web服务发起http请求登陆,而现在我们需要客户端自动登陆,正常来说我们只需要读取usbkey的用户信息,填充上去,让客户端登陆就可以了,但问题是我们并不能直接通过客户端拿到usbkey的信息,需要借助于浏览器才能拿到。
- 我们希望客户端改动越少越好,这样可以减少一些不必要的麻烦,所以我们不能通过客户端打开浏览器,那么就需要一个第三方的应用程序打开浏览器。
- 那么在什么时候打开浏览器呢,应该是在客户端发起登陆的那一刻,我们的第三方调起浏览器,这个时候我们通过activex控件就可以拿到用户信息了,那么拿到用户信息,可以直接在网页里登陆web系统。
- 我们的目的是让客户端登陆,现在拿到用户信息在web上登陆成功了,也就是说用户名验证通过了,那么客户端怎么知道呢,打开浏览器是第三方应用程序打开的,所以这个时候就需要登陆web网页成功的时候,通知第三方应用程序,我登陆成功了,第三方应用程序收到登陆成功的请求的时候,再通知客户端,你登陆成功了,但是呢,客户端这个时候是并没有登陆的,怎么才能让登陆成功呢?
- 客户端要知道是否登陆成功了,只能跟之前一样再去登陆一次,只不过这次客户端不需要再验证用户名密码了,因为在浏览器那一步已经验证通过了。
- 还有一个问题,就是在客户端登陆的那一刻第三方应用程序需要拦截住登陆请求,等待网页验证通过后,再实际向服务端发起真正的登陆请求。
- 那么现在基本上整个方案已经明了了。
解决方案
我们有一个第三方程序,暂且称为agent,客户端(client),服务端(server)。
- agent进程监听客户端是否需要登陆,以及等待网页登陆成功的通知。
- agent收到client登陆的请求后,客户端阻塞等待通知,agent调起浏览器,打开登陆的网页地址,读取usbkey信息。
- 获取usbkey用户信息后,携带用户信息,向server端发起请求登陆。
- server端验证用户信息是否正确,返回登陆成功结果。
- agent收到网页登陆成功的通知后,代理client端向client原来的登陆请求地址,发起登陆请求
- agent请求成功后(这一步已经不需要验证用户信息了),告知客户端登陆成功的结果。
大致流程图
ca登陆流程图 (1).png暂且记录下思路,回头有时间了,上代码。
网友评论