什么是网站鉴权,目的是什么?
一般来说,一个网站不可能只有一种操作权限。举个例子,可能存在未登录的操作权限,登录的操作权限,以及管理
员的操作权限等。网站鉴权的目的就是用户在进行操作前,对用户的身份进行识别并判断其是否具有该操作权限的过
程。
网站鉴权的几种方式
这里我们将问题简单化,即操作权限只区分用户是否进行了登录。
Session方式实现
(1)Session实现鉴权
1>用户首先进行登录,如登录成功的话,后台会生成一个唯一的sessionId,并在后台存储对应的用户信息
(redis,数据库等等),并将sessionId写到Cookie。
2>下次该浏览器访问时,会首先判断Cookie,进而确定该用户是否进行了登录操作。
(2)Session一致性问题
即需要将在服务器存储的用户信息放在一块儿(同一个redis,mysql等),否则可能出现在一台机器上登录,
并且在该机器上保存了数据,但下一次请求访问到另一个服务器时,需要重新进行登录的情况。
JWT以及具体实现
(1)JWT鉴权的简单流程
JWT分为三部分:Header(包含加密方式等),Payload(包含用户必要信息,以及过期时间等),
Signature(由前两部分生成)。
1>用户登录成功后,后台根据用户信息加上一个用户唯一的密钥值,生成一串字符串,即Token串,将其设置
在Cookie中;
2>用户下次带Token访问,系统会先根据前两部分以及密钥值,对Token进行有效性以及正确性的验证,如果
验证通过的话,再执行下一步操作...
(2)关于鉴权时机的思考
下面提供两种方式,大家可以根据具体的网站需求进行选择:
1>将接口分为需要进行鉴权的接口(auth),不需要进行鉴权的接口(api),然后通过过滤器对auth接口
进行统一的处理,即登录进行访问,未登录跳回登录页等等逻辑。
2>上面做法存在一个问题,就是当接口中出现无法界定的接口,即登录未登录都可以进行访问。那么,按照上
面的方法就只能对接口进行拆分,分成api和auth接口。
所以,另一种方式就是索性不使用过滤器进行处理,当需要进行登录才能访问,或无法界定的接口的时
候,对token进行验证以及获取,再接着进行下面的逻辑处理。
(3)关于Token刷新的问题
一般Token的有效时间设置为1-2个小时,那么,如果过期之后,就需要重新登录获取Token。为了避免这种
情况,我们可以为Token设置一个刷新有效时间,只要Token在这个刷新有效时间内,使用旧的Token进行访
问,就会给它返回一个新的Token。这样,问题就可以解决。
oauth鉴权,了解一下(应用:第三方登录)
oauth简单来说,就是为了解决一个应用(客户端)中为了获取另一个应用(服务提供商)资源,而不需要用户向
客户端提供服务提供商账号密码信息的这样一个问题。客户端与服务提供商之间,有一个应用授权层,客户端携带
Token通过授权层获取服务提供商的资源。
第三方登录就采用的是oauth2进行授权的,这里有通过Go语言实现QQ和Github第三方登录的代码
总结
我们这里只是简单的探讨了下关于鉴权的几种方式,在实际的开发中,由于安全性,以及网站的复杂性,可能会存
在多种不同的用户权限等等,那么,就可能需要对这些方式进行一定的设计和修改。