2016-02-18 5 views
0

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

TokenError: The provided authorization grant is invalid, expired, revoked, does not match the redirection URI used in the authorization request, or was issued to another client.

Вот мое приложение до сих пор, после КоА-паспорт-пример:

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) 
    } 
)); 

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

ответ

0

Ну это, кажется, приста король в конце концов. У меня была опечатка, которая, похоже, была проблемой. Хранение вышеуказанного в случае, если кто-либо еще нуждается в помощи с 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