为了账号安全,请及时绑定邮箱和手机立即绑定

【金秋打卡】第14天 egg.js 设置对应cookie 和 egg-session 实现用户认证

标签:
Node.js

课程名称web前端架构师
课程章节:第16周 第四章 使用 egg-session 实现用户认证
主讲老师:张轩
课程内容: egg.js 设置对应的 cookie

egg.js 设置对应cookie

egg.js. 使用 cookie 对应 的cookie

使用方法

设置 cookie

ctx.cookies.set(key, value, options)

option

  • {Number} maxAge: 设置这个键值对在浏览器的最长保存时间。是一个从服务器当前时刻开始的毫秒数。
    {Date} expires: 设置这个键值对的失效时间,如果设置了 maxAge,expires 将会被覆盖。如果 maxAge 和 expires 都没设置,Cookie 将会在浏览器的会话失效(一般是关闭浏览器时)的时候失效。

  • {String} path: 设置键值对生效的 URL 路径,默认设置在根路径上(/),也就是当前域名下的所有 URL 都可以访问这个 Cookie。

  • {String} domain: 设置键值对生效的域名,默认没有配置,可以配置成只在指定域名才能访问。

  • {Boolean} httpOnly: 设置键值对是否可以被 js 访问,默认为 true,不允许被 js 访问。

  • {Boolean} secure: 设置键值对只在 HTTPS 连接上传输,框架会帮我们判断当前是否在 HTTPS 连接上自动设置 secure 的值。

除了这些属性之外,框架另外扩展了 3 个参数的支持:

  • {Boolean} overwrite:设置 key 相同的键值对如何处理,如果设置为 true,则后设置的值会覆盖前面设置的,否则将会发送两个 set-cookie 响应头。
  • {Boolean} signed:设置是否对 Cookie 进行签名,如果设置为 true,则设置键值对的时候会同时对这个键值对的值进行签名,后面取的时候做校验,可以防止前端对这个值进行篡改。默认为 true。
  • {Boolean} encrypt:设置是否对 Cookie 进行加密,如果设置为 true,则在发送 Cookie 前会对这个键值对的值进行加密,客户端无法读取到 Cookie 的明文值。默认为 false。

获取 cookie

ctx.cookies.get(key, options)

使用cookie 完成用户登录

public async signin() {
  ...
  const { username, password } = ctx.request.body;
  const user = (await service.user.findByUsername(username));
  ...
  // 设置 cookie
  ctx.cookies.set('user', JSON.stringify(user.toJSON()));
  ctx.helper.success({
    ctx,
    res: user.toJSON(),
    msg: '登录成功',
  });
}
public async getUser() {
  const { ctx } = this;
  // 获取 cookie
  const user = ctx.cookies.get('user');
  ctx.helper.success({
    ctx,
    res: user,
    msg: '获取用户信息成功',
  });
}

这样就实现了用户登录的保存和获取

我们发现设置完cookie 后,浏览器会携带两个cookie

  • user 就是我们保存在用户信息
  • user.sig 用来确保 cookie user 没有被篡改,篡改后就不会获取到用户的信息

如若我们不想在浏览器让用户看到保存的信息,可以将第二个参数的encrypt 设置为 true, 加密的key 是在 config 文件中进行配置

// config.default.ts 默认就是生成这个 key
config.keys = appInfo.name + '_1667401289129_8694';

设置加密的 cookie

ctx.cookies.set('user', JSON.stringify(user.toJSON()), {
  encrypt: true,
});

获取的时候也需要设置 encrypt

const user = ctx.cookies.get('user', {
  encrypt: true,
});

使用 egg-session 完成用户认证

egg.js 内置了 egg-session 插件

在 plugin.js 文件中开启 session

const plugin: EggPlugin = {
  ...
  session: true,
};

使用 egg-session

添加 session

class HomeController extends Controller {
  async fetchPosts() {
    const ctx = this.ctx;
    // 获取 Session 上的内容
    const userId = ctx.session.userId;
    const posts = await ctx.service.post.fetch(userId);
    // 修改 Session 的值
    ctx.session.visited = ctx.session.visited ? ctx.session.visited + 1 : 1;
    ctx.body = {
      success: true,
      posts,
    };
  }
}

修改 session 直接给它赋值就可以了,删除 session 直接给它赋值为 null 就可以了

ctx.session = null;

Session 的实现是基于 Cookie 的,默认配置下,用户 Session 的内容加密后直接存储在 Cookie 中的一个字段中,用户每次请求我们网站的时候都会带上这个 Cookie,我们在服务端解密后使用。Session 的默认配置如下:

session = {
  key: 'EGG_SESS',
  maxAge: 24 * 3600 * 1000, // 1 天
  httpOnly: true,
  encrypt: true,
};

使用 egg-session 完成用户登录

public async signin() {
  const { ctx, service, app } = this;
  ...
  const user = (await service.user.findByUsername(username));
  // 设置 session
  ctx.session.user = user;
  ctx.helper.success({
    ctx,
    res: user.toJSON(),
    msg: '登录成功',
  });
}

public async getUser() {
  const { ctx } = this;
  // 获取 session
  const user = ctx.session.user;
  ctx.helper.success({
    ctx,
    res: user,
    msg: '获取用户信息成功',
  });
}

egg-session 中对 session 的保存并没有存放到内存中,如果放在内存中,我们重启服务后,获取用户信息就获取不到,但是使用 egg-session 重启服务后仍然可以获取到用户信息。

图片描述

点击查看更多内容
TA 点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
Python工程师
手记
粉丝
2
获赞与收藏
1

关注作者,订阅最新文章

阅读免费教程

  • 推荐
  • 评论
  • 收藏
  • 共同学习,写下你的评论
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消