Vuejs2 膝关节炎后重定向丢失
我有两个Node.js服务器应用程序。第一个在本地主机上运行KOA.JS:8081,而第二个在本地主机上运行Vu.js:808.在两个服务器中,我使用HTTP而不是HTTPS.Vuejs2 膝关节炎后重定向丢失,vuejs2,passport.js,koa,koa-router,koa-session,Vuejs2,Passport.js,Koa,Koa Router,Koa Session,我有两个Node.js服务器应用程序。第一个在本地主机上运行KOA.JS:8081,而第二个在本地主机上运行Vu.js:808.在两个服务器中,我使用HTTP而不是HTTPS. KOA.JS服务器使用PasPr.js执行OAuth2登录流,并提供端点以从API获取数据,并将承载令牌传递给授权头。p> Vue.js服务器负责客户端代码。它使用AXIOS库调用膝关节炎端点。 如果我打开浏览器,并测试膝关节炎对KOA服务器的登录流,一切都正常,工作正常。以下是步骤: localhost:8081/a
KOA.JS服务器使用PasPr.js执行OAuth2登录流,并提供端点以从API获取数据,并将承载令牌传递给授权头。p> Vue.js服务器负责客户端代码。它使用AXIOS库调用膝关节炎端点。 <>如果我打开浏览器,并测试膝关节炎对KOA服务器的登录流,一切都正常,工作正常。以下是步骤:
router.get(
“/authenticate”,
passport.authenticate(
“oauth2”,
{scope:config.scope}
))
router.get(
'/callback',
ctx => {
return passport.authenticate(
'oauth2',
async (err, user) => {
if (err) ctx.throw(err)
const tokenSession = new token(ctx.session)
await ctx.login(user)
tokenSession.setPublicCredentials(user)
ctx.redirect(`${config.vuehost}/auth?isUserLoggedIn=true`)
})(ctx)
})
axios.get('http://localhost:8081/api/user/profile')
.then (response => {
console.info(`\nsetUserData response: ${JSON.stringify(response)}\n`)
})
.catch (err => {
console.info(`\nsetUserData error: ${JSON.stringify(err)}\n`)
})
router.get(
“/user/profile”,
异步(ctx)=>{
如果(ctx.isAuthenticated){
常量选项={
标题:{Authorization:`Bearer${ctx.session.passport.user.access_token}`,
是的,
方法:“GET”,
uri:'https://developer.mycoolapi.com/userprofile/v1/users/@我的
}
常量响应=等待rp(选项)
ctx.body=JSON.stringify(响应)
}否则{
ctx.投掷(401)
}
}
)
axios.get('http://localhost:8081/api/user/profile')
.then (response => {
console.info(`\nsetUserData response: ${JSON.stringify(response)}\n`)
})
.catch (err => {
console.info(`\nsetUserData error: ${JSON.stringify(err)}\n`)
})
最后一步返回未经授权的401
进一步研究表明,具有配置端点的膝关节炎路由在APPROTES中间件中。此中间件位于app.use(requireLogin)中间件之后,用于检查会话是否经过身份验证(ctx.isAuthenticated())
“严格使用”
const requireLogin=async(ctx,next)=>{
如果(ctx.isAuthenticated()){
等待下一个
}否则{
ctx.status=401
ctx.body={
错误:[{title:'Login required',状态:401}]
}
}
}
module.exports=requireLogin
这就是401错误发生的地方,因为此时ctx会话为空
//添加路由
app.use(authrouts.routes())
app.use(authrouts.allowedMethods())
应用程序使用(requireLogin)
app.use(appRoutes.routes())
app.use(appRoutes.allowedMethods())
我是在处理某种时间问题吗?我试着在我的膝关节炎服务器上评论头盔中间件,但这并没有帮助。p>
请注意,如果我在同一浏览器会话中打开一个新选项卡并转到localhost:8081/api/user/profile,它就可以正常工作。只有在从Vue.js调用此端点时,才会由于ctx.sessession为null而失败
你知道是什么将ctx.session重置为null吗?仔细阅读本文后,我终于解决了这个问题 在server.js中,将{credentials:true}传递给cors选项
app.use(cors({credentials:true}))
用泛型fetch替换axios.get()调用会导致相同的401未授权问题和空ctx.session。该问题似乎与axios库无关。