Я делаю OAuth2 Resource Server в Node, и мне нужно обработать de access_token, который поступает из AS (сделан в Spring Boot, к которому у меня нет доступа к коду, потому что он сделан другой командой), и клиентская часть выполнена в Angular 6.
Клиент хранит токен в файле cookie и должен быть отправлен на мой apis в узле, чтобы разрешить выполнение запросов, и вот где я застрял
Я пробовал некоторые библиотеки с помощью passport.js, но у меня нет большого опыта работы с Node, поэтому я не смог правильно обработать cookie. Теперь у меня ошибка 500, и консоль выдает мне стратегическую ошибку «Может быть, вы забыли использовать cookie-парсер?», Очевидно, я пытался использовать cookie-парсер, но кажется, что я делаю что-то не так
Мой пользовательский метод cookie в index.js (паспорт)
export const cookie = ({ required } = {}) => (req, res, next) =>
passport.authenticate('cookie', { session: false }, () => {
res.cookie('access_token')
})(req, res, next)
passport.use('cookie', new CookieStrategy({
cookieName: 'access_token'
},
function (token, done) {
User.findByToken({ token: token }, function (err, user) {
if (err) { return done(err) }
if (!user) { return done(null, false) }
return done(null, user)
})
}))
Мой метод GET для получения списка клиентов:
router.get('/',
cookie({ required: true }),
query(),
index)
Я пытался обрабатывать токен на предъявителя, потому что в Angular я отправляю токен в api URL с заголовками, которые берут токен из cookie-файла (я сделал тот же Resource Server в Spring Boot, и там он работает нормально). Вот код для токена, а не cookie:
export const token = ({ required } = {}) => (req, res, next) =>
passport.authenticate('token', { session: false }, (err, user, info) => {
if (err || (required && !user) || (required)) {
return res.status(401).end()
}
req.logIn(user, { session: false }, (err) => {
if (err) return res.status(401).end()
next()
})
})(req, res, next)
passport.use('token', new JwtStrategy({
secretOrKey: jwtSecret,
jwtFromRequest: ExtractJwt.fromExtractors([
ExtractJwt.fromHeader('Authorization: Bearer '),
ExtractJwt.fromAuthHeaderAsBearerToken(),
ExtractJwt.fromUrlQueryParameter('access_token'),
ExtractJwt.fromBodyField('access_token'),
ExtractJwt.fromAuthHeaderWithScheme('Bearer')
])
}, ({ id }, done) => {
User.findById(id).then((user) => {
done(null, user)
return null
}).catch(done)
}))
И мне просто нужно изменить router.get "cookie" на "token"
Это заголовки запроса:
Host: localhost:9000
User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:67.0) Gecko/20100101 Firefox/67.0
Accept: application/json, text/plain, */*
Accept-Language: es,en-US;q=0.7,en;q=0.3
Accept-Encoding: gzip, deflate
Referer: http://localhost:8080/ui/login
Content-type: application/x-www-form-urlencoded; charset=utf-8
Authorization: Bearer some_token
Origin: http://localhost:8080
DNT: 1
Connection: keep-alive
Я ожидаю, что токен, отправленный клиентом в Angular, работает для моего сервера ресурсов в узле.
Большое спасибо!