我很难理解为什么当我的koa v2应用程序接收到来自我的oauth2提供者的回调时它是404。我在网络选项卡中看到,它正在接收带有代码查询参数的GET to /oauth/回调。我的路由确实存在,因为如果我自己在浏览器中打开页面,它会出现一个错误:
TokenError:提供的授权授予无效、过期、撤销、与授权请求中使用的重定向URI不匹配,或者是颁发给另一个客户端的。
到目前为止,这是我的应用程序,遵循考拉护照-例子:
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: 'dmarr@foo.com' }
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)
}
));谢谢你的帮助
发布于 2016-02-18 18:27:29
嗯,这似乎毕竟是起作用了。我确实有一个错误,这似乎是问题所在。保持上述条件,以防其他人需要oauth2、考拉和护照方面的帮助。
编辑:事实证明,我似乎无法通过身份验证回调访问修改后的用户。例如:
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 onehttps://stackoverflow.com/questions/35489419
复制相似问题