Я пытаюсь защитить свой API в Express с помощью Keycloak. Я использую Express исключительно как бэкэнд (защищенный ресурс в терминологии OAuth). Логин, выход из системы, хранение токена обрабатываются в одностраничном клиенте React. Я следовал руководству и вроде как заставил его работать, используя этот код:
var memoryStore = new session.MemoryStore();
var keycloak = new Keycloak({ store: memoryStore });
// Configure session
app.use(session({
secret: 'mySecret',
resave: false,
saveUninitialized: true,
store: memoryStore
}));
app.use(keycloak.middleware());
app.use('/contactReasons', keycloak.protect(), contactReasonRouter); // my protected resource
Мне неясны два момента:
- Нужно ли мне сеанс, чтобы защитить мой ресурс? Я бы хотел избавиться от него или хотя бы понять, что он делает и зачем он нужен.
- Как изменить код ответа HTTP, если пользователь отправляет неверный токен или его вообще нет? Прямо сейчас он отправляет редирект 302, который не подходит для клиента SPA:
curl -i http://localhost:3000/contactReasons -H "Authorization: Bearer invalidToken"
HTTP/1.1 302 Found
...
Found. Redirecting to http://localhost:9000/auth/realms/FoobarRealm/protocol/openid-connect/auth?client_id=Foobar-client&state=54654-83d-4282-b3e3-623aef355f91&redirect_uri=http%3A%2F%2Flocalhost%3A3000%2FcontactReasons%3Fauth_callback%3D1&scope=openid&response_type=code