没有使用 jwt 鉴权,因为 cookie 有大小限制,就总觉得少存一些东西比较好,而且对「退出登录」怎么处理 jwt 没有搞清楚,前端可能是清除 cookie,那后端怎么鼓捣没有想通!

所以选用了 cookie 中存 sessionId,redis 存储 session 这种方式,并且 koa 有相应的封装好的中间件koa-sessionkoa-redis。为啥用 redis…emmm 其实也是问了下水哥,他说之前他们都是存在 redis 里,因为登录信息访问比较多而且 redis 比较快。(然后我也是傻瓜操作,keys *列出 sessionId,get [key]看下信息就没别的了)。

关于跨域

在使用koa-session时,如果不外接存储 session 的 store,会默认将 session 信息也存到 cookie 里面,koa-redis封装了koa-session外接 store 所需要的getsetdelete方法用以在 redis 中存取数据。

当在 login 接口操作ctx.session = {...}时,koa-session 会向接口返回 set-Cookie 字段,在 response header 中能看到,但是在浏览器 application 的 cookies 里没看到,后来才知道是前端木有允许跨域,axios 上挂axios.defaults.withCredentials = true就可以了。

后端跨域用了koa2-cors这个中间件:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
import * as cors from "koa2-cors";

app.use(
  cors({
    origin: () => "http://localhost:8080",
    exposeHeaders: ["WWW-Authenticate", "Server-Authorization"],
    maxAge: 5,
    credentials: true,
    allowMethods: ["GET", "POST", "DELETE"],
    allowHeaders: ["Content-Type", "Authorization", "Accept"],
  })
);

关于 type

在对ctx.session进行getset操作时,typeScript 报错Property 'session' does not exist on type 'ParameterizedContext<any, IRouterParamContext<any, {}>>'.

解决方法:目前的解决方法是把@types/koa锁在2.0.50版本:

1
2
3
4
5
6
7
"devDependencies": {
  "@types/koa": "2.0.50",
  // ...
},
"resolutions": {
  "@types/koa": "2.0.50"
}

相关 issue:https://github.com/DefinitelyTyped/DefinitelyTyped/issues/36161