前后端分离如何实现用户身份认证及鉴权?

薄洪涛5年前Linux2609

假设我们不适用前后端分离,那么登录成功之后,我们会把用户的信息存储到session中,之后的每一次请求,都会带着cookies中的session_id,服务端会自行验证此用户是否登录及登录是否失效,那么问题来了,我们使用了前后端分离,那么就意味着没有了session,每一次的请求都是无状态的,作为后端我们不知道是登录用户请求的还是非登录用户请求的,所以,为了解决这个问题,我们有这么几种方式

  1. 授权的方式,可以参考OAUTH

  2. 用户登录之后,后端返给前端一个有过期时间的token,每次前端请求的时候就携带这个token

  3. 网关鉴权,就是我现在想说的

比较3种方法,前两种是比较常见的,但是都需要在项目的代码中做验证,对于高并发来说,性能还是有一些影响的,如果你使用的语言性能较差的话,每次请求都要在代码中验证token,验证redis等

第三种方法,适合高性能api,现在就详细说下咱们如何实现的

  1.使用openResty,天然支持lua脚本

  2.登录的时候,如果登录成功向redis中写入用户信息及失效时间

  3.要求前端调用接口的时候在header中加入鉴权数据,比如用户id,签名等信息

  4.使用lua去读取header内的内容,比如读取到了用户的id,然后根据自己制定的规则去验证签名,去redis中查询数据来实现鉴权

这块比较涉密,所以我拆分成几个小部分来大体说下思路

  1. lua获取header中的信息

local userId = ngx.req.get_headers()["userid"]
if userId == nil or userId == "" then
	ngx.say("{\"code\": 401, \"msg\":\"userid获取失败\" }")
	return
end

   2. lua连接redis并查询数据

local redis = require "resty.redis"
local red = redis:new()
red:set_timeout(1000)
local ok, err = red:connect('127.0.0.1', '6379')
if not ok then
 	ngx.log(ngx.ERR, "redis 连接失败")
 	ngx.say('{"code":500, "msg":"服务器错误(red err:1)"}')
	return
end
local userInfo, err = red:hmget("键值/",'字段名')

  3. 然后看下nginx的配置,通过access_by_lua_file来加载lua鉴权脚本,这样每次请求都会先去执行lua,然后在去执行我们的代码

server {
    charset utf-8;
    client_max_body_size 128M;

    listen 80; 
    root        /home/www/root/lvs;
    index       index.php;

    location / {
       access_by_lua_file /home/openresty/nginx/conf/lua_script/on_access.lua;
        try_files $uri $uri/ /index.php?$args;
    }

    location ~ \.php$ {
        include fastcgi_params;
        fastcgi_pass 127.0.0.1:9000;
        fastcgi_index index.php;
        fastcgi_param SCRIPT_FILENAME $document_root/$fastcgi_script_name;
        include fastcgi_params; 
    }

    location ~ /\.(ht|svn|git) {
        deny all;
    }
}

看下鉴权失败的情况,我传递了错误的鉴权数据

image.png

传递正确的数据

image.png

鉴权数据失效后,可以要求用户重新登录,然后再次将信息写入redis


标签: lua

相关文章

git默认用户名及密码

服务器设置默认全局git用户名/密码cd ~ vi .git-credentials https://{username}:{password}@git.coding.net gi...

centos8 新增服务

我在centos8上部署了一个java服务,使用java -jar xx.jar来启动服务,但是对于停掉服务,就得使用kill命令,所以想着把它做成个服务原始命令如下:/www/server/java...

secure造成的循环登录

secure造成的循环登录

在安装nextcloud和ZenTao时,出现循环登录现象,就是输入用户名和密码之后会再次跳转到登录页,开始怀疑是session权限问题,将session的保存路径权限设置为777后,问题依旧,而且,...

负载均衡配置ssl证书的坑

负载均衡配置ssl证书的坑

上周的时候,公司有个域名需要配置下ssl证书,所以这个艰巨的任务落在我的头上,开始的时候,觉得没啥啊,就配个证书而已,分分钟的事儿于是开始配置了步骤如下:合并证书文件负载均衡器导入ssl证书,配置ac...

nginx配置详解入门第一篇

nginx配置详解入门第一篇

我们从这张图开始分析nginx配置(借用网图)1. 全局块配置这个全局块配置会影响ngxin的全局,一般包括以下配置user  www; worker_processes ...

安装完宝塔后shadowsocks不能使用

安装完宝塔后shadowsocks不能使用

问题描述:近期买了个搬瓦工的服务器,配置了shadowsocks,可是FQ访问Google,速度还不错(看1080p视频还是可以的),然后想着安装宝塔来管理服务器,便于以后部署网站什么的,当安装完宝塔...

评论列表

访客
2019-12-09 10:11:43

写的挺好,楼主是做java后端吗

薄洪涛 回复:
在做,感谢来访
2019-12-11 17:58:32

发表评论    

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。