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