koa js: управление сессиями с помощью redis - PullRequest
0 голосов
/ 24 апреля 2020

Я пытаюсь выяснить, как управлять сессиями в koa и затем хранить в redis. Я использую промежуточное программное обеспечение koa-generic-session и koa-redis.

Пока что сеанс создается и сохраняется в redis хранилище просто отлично, но я не могу его уничтожить - или манипулировать им в любом другом путь. Я не передаю никаких пользовательских опций koa-generic-session и только host, port и password в koa-redis.

redis сам запускается в контейнере с использованием официального docker изображение. Моя единственная модификация состояла в том, чтобы включить сохранение.

Вот как я создаю и пытаюсь уничтожить сеанс:

  1. redis сохранить перед любыми операциями:
127.0.0.1:6379> scan 0
1) "0"
2) (empty list or set)
вход в систему с помощью вспомогательной функции:
// helper
export const logIn = async (ctx, id) => {
  ctx.session.userId = id
}

// actual login:
$ curl -X POST -v localhost:5000/login -H 'Content-Type: application/json' -d '{"email":"foo@bar.com","password":"secret"}' -c cookie.txt
Note: Unnecessary use of -X or --request, POST is already inferred.
*   Trying 127.0.0.1:5000...
* TCP_NODELAY set
* Connected to localhost (127.0.0.1) port 5000 (#0)
> POST /login HTTP/1.1
> Host: localhost:5000
> User-Agent: curl/7.65.3
> Accept: */*
> Content-Type: application/json
> Content-Length: 46
>
* upload completely sent off: 46 out of 46 bytes
* Mark bundle as not supporting multiuse
< HTTP/1.1 200 OK
< Content-Type: application/json; charset=utf-8
* Added cookie koa.sid="RlW0-3mTnu7DYgj8WZDogQ5QklXQ6BPr" for domain localhost, path /, expire 1587820434
< Set-Cookie: koa.sid=RlW0-3mTnu7DYgj8WZDogQ5QklXQ6BPr; path=/; expires=Sat, 25 Apr 2020 13:13:54 GMT; httponly
* Added cookie koa.sid.sig="ahPnyPHjwKvN1w8SxNeKRopdS60" for domain localhost, path /, expire 1587820434
< Set-Cookie: koa.sid.sig=ahPnyPHjwKvN1w8SxNeKRopdS60; path=/; expires=Sat, 25 Apr 2020 13:13:54 GMT; httponly
< Content-Length: 29
< Date: Fri, 24 Apr 2020 13:13:54 GMT
< Connection: keep-alive
<
* Connection #0 to host localhost left intact
{"status":"success","id":180}
redis хранить после входа в систему:
127.0.0.1:6379> scan 0
1) "0"
2) 1) "koa:sess:RlW0-3mTnu7DYgj8WZDogQ5QklXQ6BPr"
Выйти:
// helper
export const logOut = async (ctx) => {
  const cookie = await ctx.cookies.get('koa.sid', { signed: true })
  console.log(ctx.header.cookie) // koa.sid.sig=ahPnyPHjwKvN1w8SxNeKRopdS60; koa.sid=RlW0-3mTnu7DYgj8WZDogQ5QklXQ6BPr
  console.log(cookie) // RlW0-3mTnu7DYgj8WZDogQ5QklXQ6BPr
  await store.destroy(cookie)
}

// actual logout
 > curl -X POST -v localhost:5000/logout -b cookie.txt
*   Trying 127.0.0.1:5000...
* TCP_NODELAY set
* Connected to localhost (127.0.0.1) port 5000 (#0)
> POST /logout HTTP/1.1
> Host: localhost:5000
> User-Agent: curl/7.65.3
> Accept: */*
> Cookie: koa.sid.sig=ahPnyPHjwKvN1w8SxNeKRopdS60; koa.sid=RlW0-3mTnu7DYgj8WZDogQ5QklXQ6BPr
>
* Mark bundle as not supporting multiuse
< HTTP/1.1 200 OK
< Content-Type: application/json; charset=utf-8
< Content-Length: 20
< Date: Fri, 24 Apr 2020 13:20:14 GMT
< Connection: keep-alive
<
* Connection #0 to host localhost left intact
redis сохранить после выхода из системы:
127.0.0.1:6379> scan 0
1) "0"
2) 1) "koa:sess:RlW0-3mTnu7DYgj8WZDogQ5QklXQ6BPr"

Что мне здесь не хватает?

Возможно, проблема в том, как я инициализирую сеанс, и в используемом хранилище. в помощнике выхода. koa-generic-session и koa-redis инициализируются следующим образом:

// in server.js
export const store = new redisStore(REDIS_OPTIONS)

app.use(
  session({
    store,
  }),
)

Экспортированный store из приведенного выше фрагмента затем используется в помощнике выхода из системы при попытке уничтожить сеанс:

import { store } from '../server.js'

export const logOut = async (ctx) => {
  const cookie = await ctx.cookies.get('koa.sid', { signed: true })
  await store.destroy(cookie)
}

Но redis его не будет. Я борюсь с этим вторым днем. Интуиция говорит мне, что это что-то до боли очевидно, но я не могу понять это. Куда я сбился с пути?

...