Authentication koa passport w/passport steam:ctx.isAuthenticated()始终为假

Authentication koa passport w/passport steam:ctx.isAuthenticated()始终为假,authentication,passport.js,koa,Authentication,Passport.js,Koa,我正在使用koa passport和passport steam来使用SteamID对用户进行身份验证。尽管通过Steam正确登录,但ctx.isAuthenticated()始终为false。我一直在看很多其他的SO问题、指南和谷歌搜索结果,这个问题很常见,但总是由于某些代码中的特殊错误,而这些错误不适用于我的代码。显然,我的代码中还存在其他一些特殊问题,但我找不到它。 大多数与passport相关的代码实际上都是从教程/文档/示例中复制粘贴的。我的中间件顺序正确,据我所知,它不是会话配置问题

我正在使用koa passport和passport steam来使用SteamID对用户进行身份验证。尽管通过Steam正确登录,但ctx.isAuthenticated()始终为false。我一直在看很多其他的SO问题、指南和谷歌搜索结果,这个问题很常见,但总是由于某些代码中的特殊错误,而这些错误不适用于我的代码。显然,我的代码中还存在其他一些特殊问题,但我找不到它。 大多数与passport相关的代码实际上都是从教程/文档/示例中复制粘贴的。我的中间件顺序正确,据我所知,它不是会话配置问题

<代码>膝关节炎(KOA)=要求(“膝关节炎”); const session=require(“koa session”); const Router=require(“@koa/Router”); 常量视图=需要(“koa视图”); const passport=要求(“koa护照”); const-SteamStrategy=require(“passport-steam”)。策略; const bodyparser=require(“koa bodyparser”); 常量根=”http://localhost:3000"; const-app=新Koa(); const router=新路由器(); passport.user((用户,完成)=>{ 日志(“序列化:”,用户); 完成(空,用户); }); passport.deserializeUser((obj,done)=>{ log(“反序列化:”,obj); 完成(空,obj); }); passport.use(“steam”),新的steam策略({ returnURL:root+“/auth/steam/return”, 领域:根, apiKey:“--” }, 功能(标识符、配置文件、完成){ process.nextTick(函数(){ 让identifie=identifier.match(/\/id\/(\d+)/)[1]; profile.id=identifie console.log(“从Steam返回:”,profile); 返回完成(空,配置文件); }); }) ); app.on(“就绪”,()=>{ console.log('ready'); }); 应用程序打开(“错误”,(错误,ctx)=>{ 日志(“ERR:,ERR”); }); 常量配置={ 键:“koa.sess”, 最大年龄:10000, 安全:正确 } //我尝试了很多cookie设置,包括使用默认设置 //因为很多人在koa护照问题上似乎已经解决了 //他们通过改变会话设置来解决类似的问题,但我没有这样的运气 app.keys=['session_secret']; 应用程序使用(会话(配置,应用程序)); app.use(bodyparser()); app.use(passport.initialize()); app.use(passport.session()); 应用程序使用(视图(“视图”),{ 地图:{ ejs:“ejs” } }) ); //只是为了测试而对中间件进行的拙劣尝试。但是ctx.isAuthenticated总是返回false。 应用程序使用(异步(ctx,下一步)=>{ 如果(ctx.isAuthenticated()){ log(“嘿!你已经通过身份验证”); } 返回下一个() }); app.use(router.routes()); 路由器.get(“/”,异步(ctx,next)=>{ 等待ctx.render(“howdy.ejs”); }); get(“/auth/steam”),异步(ctx,next)=>{ log(“尝试身份验证”); 返回passport.authenticate('steam',{failureRedirect:“/fail”})(ctx); }); get(“/auth/steam/return”),异步(ctx,next)=>{ passport.authenticate('steam',{failureRedirect:“/fail”,successRedirect:“/text”})(ctx); ctx.重定向(“/text”); }); 路由器.get(“/fail”),异步(ctx,next)=>{ 等待ctx.render(“fail.ejs”); }); router.get(“/text”),异步(ctx,next)=>{ console.log(` 身份验证:${ctx.isAuthenticated()}, Unauth:${ctx.isUnauthenticated()}, 用户: `); console.log(ctx.state.user); 控制台日志(ctx.req.user); if(ctx.state.user){ 等待ctx.render(“success.ejs”); }否则{ 等待ctx.render(“fail.ejs”); } }); app.listen(3000); 让我们浏览一个示例交互: 单击索引上的按钮可转到/auth/steam<代码>尝试验证在(我的)控制台中打印,您将被重定向到Steam。您登录(登录后将重定向到/text)

我的测试打印显示Auth/Unauth/User的信息是在配置文件之前打印的,我假设这是因为某种异步竞赛。 当然,您将重新加载页面(/text)以再次获取此类信息:

    Auth: false,
    Unauth: true,
    User:
    
undefined
undefined

没有变化

到现在为止,您可能已经离开了这一点,但您的问题给了我使Steam身份验证在我的项目中工作所需要的东西,所以我想我会分享我的发现

我没有直接运行您的代码示例,但我认为这是两个问题

首先,需要更新/auth/steam/return端点。应该是这样的:

router.get("/auth/steam/return", async (ctx, next) => {
    return passport.authenticate('steam', { failureRedirect: "/fail", successRedirect: "/text" })(ctx);
});
其次,我在会话配置方面遇到了问题。特别是
secure:true
对我来说不起作用,因为我正在通过不安全的连接(http)进行测试。localhost可能有一个例外,但如果没有,更改
CONFIG
对我来说是有效的。我还更改了最大值,因为它设置为10秒或10000毫秒

const CONFIG = {
    key: 'koa.sess',
    maxAge: 86400000,
    secure: false
}

到现在为止,您可能已经离开了这一点,但您的问题为我提供了使Steam身份验证在我的项目中工作所需的东西,所以我想我会分享我的发现

我没有直接运行您的代码示例,但我认为这是两个问题

首先,需要更新/auth/steam/return端点。应该是这样的:

router.get("/auth/steam/return", async (ctx, next) => {
    return passport.authenticate('steam', { failureRedirect: "/fail", successRedirect: "/text" })(ctx);
});
其次,我在会话配置方面遇到了问题。特别是
secure:true
对我来说不起作用,因为我正在通过不安全的连接(http)进行测试。localhost可能有一个例外,但如果没有,更改
CONFIG
对我来说是有效的。我还更改了最大值,因为它设置为10秒或10000毫秒

const CONFIG = {
    key: 'koa.sess',
    maxAge: 86400000,
    secure: false
}

太棒了,谢谢。太棒了,谢谢。