Discord OAuth2 логин с коа

Я пытаюсь использовать коа и паспорт для входа в рознь.

Я использовал примеры koa-passport а также passport-discord, но почему-то я не могу заставить его работать. Кажется, что большинство из них работает (я получаю accessToken, refreshToken и информацию о профиле), но перенаправление после аутентификации никогда не происходит, страница просто показывает Not Found,

С помощью экспресс все работает.

Я думаю, что ошибка где-то здесь, но я попробовал все и не мог заставить это работать.

router.get('/auth/discord/callback', passport.authenticate('discord', {
  scope: scopes,
  failureRedirect: '/'
}, (err, profile, info) => {
  console.log(err, profile, info);
}), (ctx, next) => {
  console.log('test'); // never executed
});

В koa второе промежуточное программное обеспечение не выполняется, а в Express - выполняется. Но, глядя на koa-router документы, похоже, так и должно быть.

Это мой полный код:

server.js

const Koa = require('koa')
const app = new Koa()
const scopes = ['identify', 'guilds'];

// trust proxy
app.proxy = true

// sessions
const session = require('koa-session')
app.keys = ['your-session-secret']
app.use(session({}, app))

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

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

// routes
const fs = require('fs')
const Router = require('koa-router');

const router = new Router();

app.use((ctx, next) => {
  console.log('url', ctx.url);
  next();
});

router.get('/', function (ctx) {
  ctx.type = 'html'
  ctx.body = fs.createReadStream('server/views/login.html')
})

router.get('/logout', function (ctx) {
  ctx.logout()
  ctx.redirect('/')
})

router.get('/auth/discord', passport.authenticate('discord', {
  scope: scopes
}));
router.get('/auth/discord/callback', passport.authenticate('discord', {
  scope: scopes,
  failureRedirect: '/'
}, (err, profile, info) => {
  console.log(err, profile, info);
}), (ctx, next) => {
  console.log('test'); // never executed
});

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

router.get('/app', function (ctx) {
  ctx.type = 'html'
  ctx.body = fs.createReadStream('server/views/app.html')
})

app.use(router.routes());

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

auth.js

const passport = require('koa-passport')
const configWeb = require('../config_web.json');
const scopes = ['identify', 'guilds'];

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

passport.deserializeUser(async function (id, done) {
  try {
    done(null, {
      id: 1,
      username: 'test'
    })
  } catch (err) {
    done(err)
  }
})

var DiscordStrategy = require('passport-discord').Strategy;

passport.use(new DiscordStrategy({
    clientID: configWeb.discordClientID,
    clientSecret: configWeb.discordClientSecret,
    callbackURL: 'http://localhost:3000/auth/discord/callback',
    scopes: scopes
  },
  function (accessToken, refreshToken, profile, done) {
    console.log(accessToken, refreshToken, profile);
    return done(null, profile);
  }));

Спасибо за вашу помощь!

0 ответов

Я пытался использовать те же модули, что и вы, и благодарю вас за то, что вы поделились своим кодом, поскольку он помог мне заполнить пробелы между документацией для всех этих модулей.

Поигравшись с ним сам, я думаю, что проблема здесь в следующем:

router.get('/auth/discord/callback', passport.authenticate('discord', {
  scope: scopes,
  failureRedirect: '/'
}, (err, profile, info) => {
  console.log(err, profile, info);
}), (ctx, next) => {
  console.log('test'); // never executed
});

Следуя этому SO-ответу, я попытался изменить этот маршрут, чтобы он работал следующим образом:

router.get('/auth/discord/callback', async ctx => {
    return passport.authenticate('discord', {scope: scopes, failureRedirect: '/'},
    function(err, user, info, status) {
        console.log('test'); // This gets executed.
        // And now the ctx object is in-scope to be used from the passport callback.
        ctx.redirect('/');
    })(ctx);
});
Другие вопросы по тегам