Я пытаюсь выяснить, как управлять сессиями в koa
и затем хранить в redis
. Я использую промежуточное программное обеспечение koa-generic-session
и koa-redis
.
Пока что сеанс создается и сохраняется в redis
хранилище просто отлично, но я не могу его уничтожить - или манипулировать им в любом другом путь. Я не передаю никаких пользовательских опций koa-generic-session
и только host
, port
и password
в koa-redis
.
redis
сам запускается в контейнере с использованием официального docker
изображение. Моя единственная модификация состояла в том, чтобы включить сохранение.
Вот как я создаю и пытаюсь уничтожить сеанс:
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
его не будет. Я борюсь с этим вторым днем. Интуиция говорит мне, что это что-то до боли очевидно, но я не могу понять это. Куда я сбился с пути?