OAuth20是一个授权框架,他规定了客户从授权服务器获取令牌Token的规则。
要理解OAuth20,先要知道为什么会有这个东西产生,或者说他能帮我们解决什么问题,其实简单说他就是帮我们解决了访问安全问题。先看如下的一张图:
显示了我们没有引入任何安全机制情况下的资源访问过程,可以看到正常的用户和恶意的用户都可以通过向资源服务器的接口发送请求获得用户数据。显然恶意用户不该获取数据,他是非法获得,这个情况不应该被允许,需要一种机制保护用户数据。
OAuth20包含了资源拥有者,授权服务器,客户应用,授权服务器,资源服务器。
客户应用: 通常是一个 WebWeb 或者无线应用,它需要访问用户的。
资源服务器: 是一个 webweb 站点 或者 web service web service web service web service API ,用户的受保护。
授权服务器: 在客户应用成功认证并获得授权之后,向客户应用颁发访问令牌Access Token。
资源拥有者: 资源的拥有人,想要分享某些资源给第三方应用。
1)授权码(Authorization Code Token),仅用于授权码授权类型,用于交换获取访问令牌和刷新令牌
2)刷新令牌(Refresh Token),用于去授权服务器获取一个新的访问令牌
3)访问令牌(Access Token),这是OAuth令牌类型中最核心的一个,用于代表一个用户或服务直接去访问受保护的资源
4)Bearer Token,不管谁拿到Token都可以访问资源,像现钞
5)Proof of Possession(PoP) Token,可以校验client是否对Token有明确的拥有权
上面提到了需要提供一种机制来保护数据,OAuth20提供的就是一种授权机制,就是说用户要访问资源必须先通过授权服务器授权拿到Access Token(访问授权),他拿着这个Access Token才能去资源服务器去要他想要的数据,示意图如下:
这里看到我们引入了一个授权服务器,这个授权服务器就是专门负责颁发Access Token的,客户应用需要从授权服务器中获得Access Token,获得后再向资源服务器去获取数据,请求中包含了Token一起发到资源服务器,资源服务器首先要验证这个Token是否合法,如果合法再返回数据给客户应用。
上图中红色圈圈圈起来的就是OAuth20框架协议工作的地方,他规定了客户应用如何获取Access Token,以及如何使用Token的整个过程。
其中核心的授权服务器包括了授权端点,令牌端点,校验端点,注销端点,如下图所示:
OAuth20中规定了多种授权模式,各种模式实现的复杂程度和安全系数不一样,我们先分别看一下四种授权模式:
1)授权码(Authrization Code)模式:
基本流程是先通过前端渠道客户获取授权码,然后通过后端渠道,客户使用Authrization Code去交换Access Token和可选的Refresh Token,这种模式是最安全的模式,因为令牌不会通过user-agent去传递,完整的过程如下图:
授权码模式的优点是比较安全,他可以有token过期时间,而且上面的第四和第五步都是在服务器之间的访问,很难被截获,用户信息也存在服务端,这样就保证了他的安全性。他的缺点是需要进行多次请求才能访问到资源。
授权码模式假定资源拥有者和客户不在一台设备上,他拥有高安全性的保障,目前市面上主流的第三方认证都是采用这种模式。
2)隐式/简化(Implicit)模式
基本流程是Access Token直接通过前端渠道从授权服务器返回,完整的过程如下图:
3)密码(Resource Owner Password)模式
基本流程是使用用户名/密码作为授权方式从授权服务器上获取Access Token,而且一般不支持refresh token,完整的过程如下图:
4)客户端(Client)模式
基本流程是通过后端渠道去获取一个Access Token,因为客户凭证可以使用对称或者非对称加密,该方式支持共享密码和证书,完整的过程如下图:
客户端模式适合用作服务器间通信场景。
授权码模式有一个基本的选择流程,如下图:
MQTT是一个轻量级的消息发布/订阅协议,它是实现基于手机客户端的消息推送服务器的理想解决方案。我们可以从这里下载该项目的实例代码,并且可以找到一个采用PHP书写的服务器端实现。架构如下所示:wmqttjar 是IBM提供的MQTT协议的实现。你可以从如下站点下载它。你可以将该jar包加入你自己的Android应用程序中。Really Small Message Broker (RSMB) ,他是一个简单的MQTT代理,同样由IBM提供。缺省打开1883端口,应用程序当中,它负责接收来自服务器的消息并将其转发给指定的移动设备。SAM是一个针对MQTT写的PHP库。你可以从这个下载它send_mqttphp是一个通过POST接收消息并且通过SAM将消息发送给RSMB的PHP脚本。实例代码:Ø 采用XMPP协议实现Android推送这是我在项目中采用的方案。事实上Google官方的C2DM服务器底层也是采用XMPP协议进行的封装。XMPP(可扩展通讯和表示协议)是基于可扩展标记语言(XML)的协议,它用于即时消息(IM)以及在线探测。这个协议可能最终允许因特网用户向因特网上的其他任何人发送即时消息。androidpn是一个基于XMPP协议的java开源Android push notification实现。它包含了完整的客户端和服务器端。经过源代码研究我发现,该服务器端基本是在另外一个开源工程openfire基础上修改实现的,不过比较郁闷的是androidpn的文档是由韩语写的,所以整个研究过程基本都是读源码。它的实现示意图如下:androidpn客户端需要用到一个基于java的开源XMPP协议包asmack,这个包同样也是基于openfire下的另外一个开源项目smack,不过我们不需要自己编译,可以直接把androidpn客户端里面的asmackjar拿来使用。客户端利用asmack中提供的XMPPConnection类与服务器建立持久连接,并通过该连接进行用户注册和登录认证,同样也是通过这条连接,接收服务器发送的通知。androidpn服务器端也是java语言实现的,基于openfire开源工程,不过它的Web部分采用的是spring框架,这一点与openfire是不同的。Androidpn服务器包含两个部分,一个是侦听在5222端口上的XMPP服务,负责与客户端的XMPPConnection类进行通信,作用是用户注册和身份认证,并发送推送通知消息。另外一部分是Web服务器,采用一个轻量级的>DNS 服务 需要在正向解析里将WEB服务器的IP地址和这个域名>
网络里必须要有交换机 IP地址 自己设置就可以了 ,我想在具体的步骤就没必要了,如果这样都不怎么看的懂,那可能需要详细的学下了
本发明所述的智能云锁系统,包括与电控锁相连的智能云锁、经过管理控制台授权的移动客户端,以及设置于阿里云端的服务器,智能云锁包括通信模块ⅰ和显示二维码数据的显示模块ⅰ;移动客户端包括通信模块ⅱ和采集二维码数据的图像采集模块ⅱ;服务器分别与通信模块ⅰ、通信模块ⅱ无线相连,服务器包括存储智能云锁id信息和移动客户端id信息的存储模块,一台id信息的存储智能云锁通过存储模块仅连接经过管理控制台授权id信息的移动客户端,不同的存储智能云锁的id信息存储在存储模块的不同位置;存储智能云锁id信息和移动客户端id信息匹配后,智能云锁开启。
优选地,所述智能云锁包括控制器、按键模块和继电器模块,按键模块通过继电器模块与控制器相连,按键模块输入的信息通过通信模块ⅰ上传到服务器,与存储模块内的信息匹配后,智能云锁开启。
优选地,所述服务器采用tomcat服务器,其运行在linux系统的web环境下,其存储模块包括用来记录用户提交的个人信息及开锁权限的mysql数据库,以及用于记录微信app的登陆状态的redis数据库;服务器生成刷新频率可选的二维码数据。
优选地,所述移动客户端采用智能手机或者智能pad,移动客户端上安装有加载开锁小程序的微信app,该开锁小程序通过通信模块ⅱ下载并显示由java运行下的生成随机的二维码数据。
本发明所述的智能云锁系统的开锁方法,包括如下步骤:
步骤一:开机后智能云锁初始化,并通过通信模块ⅰ连接至服务器的通信模块ⅲ;
步骤二:通信模块ⅰ接收服务器随机生成的二维码数据,并发送给控制器并将其显示到液晶屏上;
步骤三:客户打开移动客户端上微信app中的开锁小程序扫描液晶屏上的二维码数据,并通过通信模块ⅱ将其上传到服务器;
步骤四:服务器将来自移动客户端的二维码数据与存储模块中的数据进行比对,如果比对不通过,则继续等待;如果比对通过,则说明有开锁权限,下达开锁指令至智能云锁;
步骤五:智能云锁等待来自服务器的开锁指令,如果没有收到开锁指令,则继续等待;如果收到开锁指令则通过控制器控制继电器开启电控锁,完成开锁。
优选地,所述步骤三还包括以下前置步骤:
第一步:客户打开移动客户端上微信app中的开锁小程序扫描液晶屏上的二维码数据,并通过通信模块ⅱ将其上传到服务器;
第二步:服务器将新加入的移动客户端id信息存储至存储器;
第三步:管理员通过pc端的管理控制台登录服务器,访问服务器新加入的移动客户端id信息,如果认可该移动客户端则授权,如果不认可移动客户端则拒绝;
第四步:服务器接收管理员的授权或者拒绝指令,并存储至存储模块中。
优选地,所述步骤四中,所述存储模块中的个人信息、微信app的登陆状态均不可访问,管理控制台可访问开锁权限信息。
优选地,所述服务器连接至少一台智能云锁和至少一台移动客户端,智能云锁与移动客户端为多对多的关系,即同一台智能云锁连接至少一台移动客户端且同一台移动客户端连接至少一台智能云锁;两个不同id信息的智能云锁之间、两个不同id信息的移动客户端之间均不可访问。
本发明的有益效果是:采用本发明所述的智能云锁系统采用存储模块划分不同的位置,保证了客户的开锁信息的安全性。本发明所述的智能云锁系统的开锁方法,利用微信小程序,简单快捷,无需另外安装app,存在粘性强的优点,体验效果好;开锁过程极大程度的避免客户的财产不受到非法的侵害,具有很大的研究和开发的意义。本发明可以广泛用于学校门禁、居民区门禁、企业门禁等场合。
附图说明
图1是本发明的结构原理框图。
图2是智能云锁的结构原理框图。
图3是移动客户端的结构原理框图。
图4是服务器的结构示意图。
图5是智能云锁控制器的电气连接图。
图6是智能云锁通信模块ⅰ的电气连接图。
图7是智能云锁继电器的电气连接图。
图8是本发明的流程框图。
图9是步骤三的前置步骤流程框图。
图10是服务器授权界面图。
图11(a)是微信app开锁小程序授权前的界面图。
图11(b)是微信app开锁小程序授权后的界面图。
图12(a)是智能云锁显示二维码数据的界面图。
图12(b)是智能云锁显示开锁成功的界面图。
图12(c)是开锁小程序显示开锁成功的界面图。
具体实施方式
为了使本发明目的、技术方案更加清楚明白,下面结合实施例,对本发明作进一步详细说明。
实施例一:
如图1至图7所示,本发明所述的智能云锁系统,包括与电控锁相连的智能云锁、经过管理控制台授权的移动客户端,以及设置于阿里云端的服务器,智能云锁包括通信模块ⅰ和显示二维码数据的显示模块ⅰ;移动客户端包括通信模块ⅱ和采集二维码数据的图像采集模块ⅱ;服务器分别与通信模块ⅰ、通信模块ⅱ无线相连,服务器包括存储智能云锁id信息和移动客户端id信息的存储模块,一台id信息的存储智能云锁通过存储模块仅连接经过管理控制台授权id信息的移动客户端,不同的存储智能云锁的id信息存储在存储模块的不同位置;存储智能云锁id信息和移动客户端id信息匹配后,智能云锁开启。
所述智能云锁系统还包括位于智能云锁上的图像采集模块ⅰ和位于移动客户端上的显示模块ⅱ,图像采集模块ⅰ采集显示模块ⅱ上的二维码数据。
所述智能云锁系统还包括移动客户端的按键模块和位于智能云锁的存储模块,按键模块输入的信息通过通信公司网络连接到智能云锁的通信模块ⅰ,输入的信息与存储模块内的信息匹配后,智能云锁开启。
如图2和图5所示,所述智能云锁包括型号为stm32f103vct6的控制模块、型号为sim800c的通信模块ⅰ、型号为lm2596-5v的电源模块、继电器模块和为液晶屏的显示模块,控制模块分别与通信模块ⅰ、电源模块、继电器模块和显示模块相连。
如图4所示,所述服务器采用tomcat服务器,其运行在linux系统的web环境下,其存储模块包括用来记录用户提交的个人信息及开锁权限的mysql数据库,以及用于记录微信app的登陆状态的redis数据库;服务器生成刷新频率可选的二维码数据。
如图3所示,所述移动客户端采用智能手机或者智能pad,移动客户端上安装有加载开锁小程序的微信app,该开锁小程序通过通信模块ⅱ下载并显示由java运行下的生成随机的二维码数据。
需要说明的是:通信模块ⅰ使用sim800c模块,该模块可支持4频gsm/gprs,工作的频段为:gsm850、egsm900、dcs1800和pcs1900mhz,与服务器通信。服务器采用阿里服务器,采用阿里服务器,可靠性高,性能强,linux系统开发简单,性价比高,多节点可选,满足该设计要求。采用微信小程序,开发简单,方便,实用,开发成本低,不需要下载和安装,方便用户使用。微信小程序是一种全新的连接用户与服务的方式,它可以在微信内被便捷地获取和传播,同时具有出色的使用体验。
阿里服务器与linux系统的配置步骤如下:
第一步:远程连接阿里云主机。
第二步:使用阿里云自带的分区工具auto_fdisksh给数据盘分区并格式化、挂载。
第三步:配置系统——linux一键安装web环境。
服务器运行在linux系统下,其中mysql数据库用来记录用户提交的个人信息及开锁权限。redis数据库用于记录微信app的登陆状态。tomcat服务器用于部署云锁的web应用,及java程序。
在服务器和微信小程序的前提下,为了使安全系数提高,将利用服务器在液晶屏上显示由java运行下的生成任意的二维码,并且每分钟刷新一次,刷新频率可以自己更改,只有管理员给用户权限,用户利用微信小程序扫描二维码,通过服务器识别判定,才可以打开电控锁。从而提高了系统的安全性。如果手机丢失,只需要告诉管理员,将会取消该微信的权限,进而得到安全保障。
1)控制器与服务器通信:服务器将二维码数据以及开锁指令发送给控制器。
2)移动客户端与服务器通信:开锁权限的申请以及开锁命令的请求。
3)继电器控制:用于控制电控锁的开启。
4)显示模块:用于显示服务器生成的二维码数据。
本发明的有益效果是:采用本发明所述的智能云锁系统采用存储模块划分不同的位置,保证了客户的开锁信息的安全性。
实施例二:
如图8至图12(c)所示,本发明所述的智能云锁系统的开锁方法,包括如下步骤:
步骤一:开机后智能云锁初始化,并通过通信模块ⅰ连接至服务器的通信模块ⅲ;
步骤二:通信模块ⅰ接收服务器随机生成的二维码数据,并发送给控制器并将其显示到液晶屏上;
步骤三:客户打开移动客户端上微信app中的开锁小程序扫描液晶屏上的二维码数据,并通过通信模块ⅱ将其上传到服务器;
步骤四:服务器将来自移动客户端的二维码数据与存储模块中的数据进行比对,如果比对不通过,则继续等待;如果比对通过,则说明有开锁权限,下达开锁指令至智能云锁;
步骤五:智能云锁等待来自服务器的开锁指令,如果没有收到开锁指令,则继续等待;如果收到开锁指令则通过控制器控制继电器开启电控锁,完成开锁,如图12(a)至图12(c)。
如图9所示,所述步骤三还包括以下前置步骤:
第一步:客户打开移动客户端上微信app中的开锁小程序扫描液晶屏上的二维码数据,并通过通信模块ⅱ将其上传到服务器;
第二步:服务器将新加入的移动客户端id信息存储至存储器;
第三步:管理员通过pc端的管理控制台登录服务器,访问服务器新加入的移动客户端id信息,如果认可该移动客户端则授权,如果不认可移动客户端则拒绝,如图10和图11(b)所示;
第四步:服务器接收管理员的授权或者拒绝指令,并存储至存储模块中。
所述步骤四中,所述存储模块中的个人信息、微信app的登陆状态均不可访问,管理控制台可访问开锁权限信息。
所述服务器连接至少一台智能云锁和至少一台移动客户端,智能云锁与移动客户端为多对多的关系,即同一台智能云锁连接至少一台移动客户端且同一台移动客户端连接至少一台智能云锁;两个不同id信息的智能云锁之间、两个不同id信息的移动客户端之间均不可访问。
本发明的有益效果是:本发明所述的智能云锁系统的开锁方法,利用微信小程序,简单快捷,无需另外安装app,存在粘性强的优点,体验效果好;开锁过程极大程度的避免客户的财产不受到非法的侵害,具有很大的研究和开发的意义。
实施例三:
下面通过测试例对于本发明作出进一步的解释。
一、测试准备
s1:将sim卡装入sim800c模块中,并将sim800c与控制器连接。
s2:将控制器与液晶屏、继电器模块等外设相连接。
s3:给主控板通电,系统初始化。
二、测试过程
s4:用户扫描二维码下载微信小程序,并且打开小程序,如图11(a)至图11(b)所示。
s5:编辑开锁权限申请,管理员登陆云服务器,查看申请并同意,如图10所示。
s6:用户扫描液晶显示屏上生成的二维码,如图12(a)至图12(c)所示。
s7:等待五秒之内门锁开启。
三、测试结果
经过测试用户可通过扫描二维码下载微信小程序,打开小程序申请开锁权限,等待管理员授权。此时,用户扫描液晶显示屏上生成的二维码即可开启门锁,完成了预期设计目的。
本发明具有以下优点:
(1)方便快捷:该智能云锁系统只需用手机扫码就可以开锁,省去了传统机械锁携带钥匙的繁琐。
(2)数据互联:该门禁系统的数据都保存到了云服务器,即使断电,数据也不会丢失。
(3)系统简洁:该智能云锁系统因为采用了sim800c集成模块与单片机相结合进行控制,这样就避免了传统有线远程控制中布线,维护线路的繁琐工序,使得设备系统的架设变得非常的简洁并且易于维护,同时也降低了运行成本。
(4)管理简单:管理员只需在pc端登录服务器就能对用户进行授权管理,从而简化了管理过程。
(5)安全性高:显示屏生成任意的二维码,并且每分钟刷新一次,刷新频率可以自己更改,而且只有管理员授权后用户才能开启门锁,从而提高了系统的安全性。
本发明在实际生产生活中具有很大的意义,能被广泛的应用于家庭、工厂、政府、公司等各类场所,有效的消除安全忧虑的同时也具有很大的商业利用价值。
以上所述仅为本发明的较佳实施例而己,并不以本发明为限制,凡在本发明的精神和原则之内所作的均等修改、等同替换和改进等,均应包含在本发明的专利涵盖范围内。
使用ServletSocket创建TCP服务器端
从图 中看上去TCP通信的两个通信实体之间并没有服务器端 客户端之分 但那是两个通信实体已经建立虚拟链路之后的示意图 在两个通信实体没有建立虚拟链路之前 必须有一个通信实体先做出 主动姿态 主动接收来自其他通信实体的连接请求
Java中能接受其他通信实体连接请求的类是ServerSocket ServerSocket对象用于监听来自客户端的Socket连接 如果没有连接 它将一直处于等待状态 ServerSocket包含一个监听来自客户端连接请求的方法
Socket accept() 如果接收到一个客户端Socket的连接请求 该方法将返回一个与客户端Socket对应的Socket(如图 所示每个TCP连接有两个Socket) 否则该方法将一直处于等待状态 线程也被阻塞
为了创建ServerSocket对象 ServerSocket类提供了如下几个构造器
ServerSocket(int port) 用指定的端口port来创建一个ServerSocket 该端口应该是有一个有效的端口整数值 ~
ServerSocket(int port int backlog) 增加一个用来改变连接队列长度的参数backlog
ServerSocket(int port int backlog InetAddress localAddr) 在机器存在多个 IP地址的情况下 允许通过localAddr这个参数来指定将ServerSocket绑定到指定的IP地址
当ServerSocket使用完毕 应使用ServerSocket的close()方法来关闭该ServerSocket 通常情况下 服务器不应该只接受一个客户端请求 而应该不断地接受来自客户端的所有请求 所以Java程序通常会通过循环 不断地调用ServerSocket的accept()方法 如下代码片段所示
//创建一个ServerSocket 用于监听客户端Socket的连接请求
ServerSocket ss = new ServerSocket( )
//采用循环不断接受来自客户端的请求
while (true)
{
//每当接受到客户端Socket的请求 服务器端也对应产生一个Socket
Socket s = ss accept()
//下面就可以使用Socket进行通信了
…
}
上面程序中创建ServerSocket没有指定IP地址 则该ServerSocket将会绑定到本机默认的IP地址 程序中使用 作为该ServerSocket的端口号 通常推荐使用 以上的端口 主要是为了避免与其他应用程序的通用端口冲突
返回目录 疯狂Java讲义
编辑推荐
Java程序性能优化 让你的Java程序更快 更稳定
新手学Java 编程
lishixinzhi/Article/program/Java/hx/201311/27266
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)