404 из callbackURL с koa-паспортом с использованием стратегии Passport-oauth2

Мне трудно понять, почему мое приложение koa v2 выдает ошибку 404, когда оно получает обратный вызов от моего поставщика oauth2. Я вижу на вкладке сети, что он получает GET to / oauth / callback с параметром запроса кода. Мои маршруты определенно существуют, потому что если я сам открою страницу в браузере, она будет 500 с ошибкой:

TokenError: предоставленное разрешение на авторизацию недействительно, истекло, отозвано, не соответствует URI перенаправления, используемому в запросе авторизации, или было выдано другому клиенту.

Вот мое приложение, следуя примеру koa-Passport:

const Koa = require('koa')
const app = new Koa()

// trust proxy
app.proxy = true

// sessions
const convert = require('koa-convert')
const session = require('koa-generic-session')
app.keys = ['your-session-secret']
app.use(convert(session()))

// body parser
const bodyParser = require('koa-bodyparser')
app.use(bodyParser())

// authentication
require('./authn')
const passport = require('koa-passport')
app.use(passport.initialize())
app.use(passport.session())

// routes
const fs    = require('fs')
const route = require('koa-route')

app.use(route.get('/logout', function(ctx) {
  ctx.logout()
  ctx.redirect('/login')
}))

app.use(route.get('/login',
  passport.authenticate('oauth2')
))

app.use(route.get('/oauth/callback',
  passport.authenticate('oauth2', {
      failureRedirect: '/login',
      successRedirect: '/'
  })
))

// Require authentication for now
app.use(function(ctx, next) {
  console.log('auth check', ctx.isAuthenticated())
  if (ctx.isAuthenticated()) {
    return next()
  } else {
    ctx.redirect('/login')
  }
})

app.use(route.get('/', function(ctx) {
  ctx.type = 'html'
  ctx.body = fs.createReadStream('views/app.html')

  const { token } = ctx.state
  const authed = ctx.isAuthenticated()

  if (authed) {
    console.log('token', token)
  }
}))

// start server
const port = process.env.PORT || 3000
app.listen(port, () => console.log('Server listening on', port))

И файл authn.js:

import passport from 'koa-passport'

const user = { id: 1, username: '[email protected]' }

passport.serializeUser(function(user, done) {
  done(null, user.id)
})

passport.deserializeUser(function(id, done) {
  done(null, user)
})

var OAuth2Strategy = require('passport-oauth2').Strategy
passport.use(new OAuth2Strategy({
    authorizationURL: 'redacted',
    tokenURL: 'https://redacted/token',
    clientID: 'redacted',
    clientSecret: 'redacted',
    callbackURL: "http://localhost:8080/oauth/callback"
  },
  function(accessToken, refreshToken, profile, done) {
    console.log('authed with oauth')
    console.log('token', accessToken)
    console.log('refresh token', refreshToken)
    done(null, user)
    // User.findOrCreate({ exampleId: profile.id }, function (err, user) {
    //   return done(err, user);
    // });
    // console.log(accessToken)
  }
));

Спасибо за любую помощь


person dmarr    schedule 18.02.2016    source источник


Ответы (1)


Что ж, похоже, это все-таки работает. У меня была опечатка, в которой, похоже, была проблема. Сохранение вышеуказанного на случай, если кому-то еще понадобится помощь с oauth2, koa и паспортом.

Изменить: оказывается, я не могу получить доступ к измененному пользователю из обратного вызова аутентификации. Например:

function(accessToken, refreshToken, profile, done) {
  user.accessToken = accessToken
  done(null, user)
})

и в моем обработчике маршрута

const { passport } = ctx.session
const user = passport.user
// user.accessToken is undefined because session.passport.user is the serialized one
person dmarr    schedule 18.02.2016