koa 实现session登陆

Posted shellcoochi

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了koa 实现session登陆相关的知识,希望对你有一定的参考价值。

技术图片

在我们访问一些网站内部内容的时候,通常都会先验证我们是否已经登陆,如果登陆了就跳转到内容页面否则就跳转或者弹出登陆页面。

但是HTTP协议是没有状态的协议,无法标识一个用户的登录状态。

于是Cookies和Session的应用就很好的解决了这个问题。

koa实现session登陆的方法很简单,首先引入依赖‘koa-session‘

const session = require(‘koa-session‘);

配置session参数

//session配置
const session_signed_key = ["some secret hurr"];  // 这个是配合signed属性的签名key
const sessionConfig = {
    key: ‘koa:sess‘,   //cookie key (default is koa:sess)
    maxAge: 1800000,  // 过期时间(毫秒) maxAge in ms (default is 1 days)
    overwrite: true,  //是否可以overwrite    (默认default true)
    httpOnly: true, //cookie是否只有服务器端可以访问 httpOnly or not (default true)
    signed: true,   //签名默认true
    rolling: false,  //在每次请求时强行设置cookie,这将重置cookie过期时间(默认:false)
    renew: false,  //(boolean) renew session when session is nearly expired,
};

加载中间件(一定要注意中间件的加载顺序)

app.keys = session_signed_key;
app.use(session(CONFIG, app));

登录接口部分

/**
 * 登陆
 * @author Shellcoochi
 * @param ctx
 * @param next
 * @returns {Promise<void>}
 */
let fn_sign_in = async (ctx, next) => {
    let name = ctx.request.body.username || ‘‘,
        password = ctx.request.body.password || ‘‘;
    console.log(`signin with name: ${name}, password: ${password}`);
    if (name === ‘Shellcoochi‘ && password === ‘12345‘) {
        //设置session
        ctx.session.userState = true;
        ctx.session.username = name;
      
        ctx.response.body = {
            state:‘success‘,
            msg:‘登陆成功‘
        };
        console.log(‘登陆成功‘);
    } else {
        ctx.response.body = {state:‘defeat‘};
    }
};

设置session的同时我们也可以设置前端的Cookies

/**
 * 登陆
 * @author Shellcoochi
 * @param ctx
 * @param next
 * @returns {Promise<void>}
 */
let fn_sign_in = async (ctx, next) => {
    let name = ctx.request.body.username || ‘‘,
        password = ctx.request.body.password || ‘‘;
    console.log(`signin with name: ${name}, password: ${password}`);
    if (name === ‘Shellcoochi‘ && password === ‘12345‘) {
        //设置session
        ctx.session.userState = true;
        ctx.session.username = name;
        //设置cookie
        ctx.cookies.set(
            ‘shellcoochi@‘,//name
            ‘mytoken@‘,    //value(可替换为token)
            cookieConfig
        );
        ctx.response.body = {
            state:‘success‘,
            msg:‘登陆成功‘
        };
        console.log(‘登陆成功‘);
    } else {
        ctx.response.body = {state:‘defeat‘};
    }
};

Cookies相关配置

注:每一个域名都有自己对应的Cookies,如果两个域名同属于一个域名的二级域名

可以设置他们的domain为一级域名,这样两个二级域名都可以访问到一级域名的Cookies,实现在一级域名相同的情况下的Cookies的“跨域”操作

//cookie配置
const cookieConfig = {
    domain: ‘localhost‘,  // 写cookie所在的域名
    path: ‘/‘,       // 写cookie所在的路径
    maxAge: 1800000, // cookie有效时长
   // expires: new Date(‘2017-02-15‘),  // cookie失效时间
    httpOnly: false,  // 是否只用于http请求中获取
    overwrite: false  // 是否允许重写
}

如果当前用户处于登录状态许访问后台接口,或者正在访问不需要登陆就可以访问的接口,则允许通过,否则不允许访问。

我们可以在一个访问进入路由前加一个简单的拦截器

const allowpage = [‘/node/signin‘]//允许直接访问的接口
module.exports = function(ctx, next){
    let url = ctx.originalUrl;
    if(allowpage.indexOf(url)>-1){
        console.log("正在登陆。。。");
    }else if(ctx.session.userState){
        console.log("正在访问接口:"+url);
    }else{
        console.log("session 已失效,请重新登录");
        ctx.redirect(null);
    }
};

删除session

/**
 * 登出
 * @author Shellcoochi
 * @param ctx
 * @param next
 * @returns {Promise<void>}
 */
let fn_sign_out = async (ctx,next)=>{
    if(ctx.session){
        ctx.session =null;//清空session
        ctx.response.body = {
            state:‘success‘,
            msg:‘登出成功‘
        }
        console.log(‘登出成功‘)
    }else{
        ctx.response.body = {
            state:‘defeat‘,
            msg:‘session 已失效‘
        }
        console.log("当前 session 已失效");
    }
};

 

 技术图片

 

以上是关于koa 实现session登陆的主要内容,如果未能解决你的问题,请参考以下文章

nodejs+koa+uniapp实现微信小程序登陆获取用户手机号及openId

Vue+Vant+Koa2+MongoDB 实现用户登陆

koa-session源码学习——session处理流程

koa使用koa-passport实现路由进入前登录验证

koa2实现session的两种方式(基于Redis 和MySQL)

个人博客设计记录