OAuth2: обрабатывать access_token с сервера аутентификации, выполненного в Spring Boot, на сервере ресурсов, созданном в узле - PullRequest
0 голосов
/ 06 мая 2019

Я делаю 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, работает для моего сервера ресурсов в узле.

Большое спасибо!

...