Express-session在使用请求模块的服务器端Ajax请求(用于Spotify API)后不保存设置的变量

问题描述 投票:2回答:2

我正在尝试创建一个网站,以根据流派来组织音乐,因此,我需要使用spotify API。我授权并将session.loggedIn和其他变量设置为所需的变量。但是,这些变量在设置后不会保存。以下是最重要的代码(还包括完整的代码)。登录后是访问Spotify登录页面并被重定向后发送给用户的位置。

request.post(clientServerOptions, (err, postres, body) => onReplyToAuth(req,res,err,postres,body))然后从服务器调用auth POST,以获取用于数据访问的密钥。通讯全部成功,正文中接收到的数据是正确的数据(已确认)。

{
  if(req.session.loggedIn) res.redirect(res.locals.pathPrefix+"/listofplaylists");
  else if(true)
  {
    var code = req.query.code
    if(!code) res.redirect(res.locals.pathPrefix);
    else
    {
      req.session.authCode = code;
      var clientServerOptions = 
      {
        url: "https://accounts.spotify.com/api/token",
        form: 
        {
          grant_type : "authorization_code",
          code: code,
          redirect_uri:"http://www.localhost:8080"+res.locals.pathPrefix+"/afterSignIn"
        },
        headers:
        {
          'Authorization' : 'Basic ' + (new Buffer(myClientId+":"+myClientSecret).toString("base64"))
        },
        json: true
      };
      request.post(clientServerOptions, (err, postres, body) => onReplyToAuth(req,res,err,postres,body));
    }

  }
  else
  {
    res.redirect(res.locals.pathPrefix);
  }
});

function onReplyToAuth(req,res,err,postres,body)
{
  console.log(body);
  if(!err)
  {
    req.session.loggedIn = true;
    req.session.loggingIn = false;
    req.session.accessToken = body.access_token;
    req.session.refreshToken = body.refresh_token;  
    console.log("Before saving:");
    console.log(req.session);
    req.session.save(function(err) 
    {
      if(!err)
      {
        console.log("After saving:")
        console.log(req.session);
        res.redirect(res.locals.pathPrefix+"/listofplaylists");
      }
    });

  }
  else
  {
    res.redirect(res.locals.pathPrefix);
  }
}

使用router.use((req,res,next)=>{console.log(req.session);next()});,我注意到在新请求中,所有设置变量的req.session.x均未定义。此外,我检查了代码的执行情况(分配后使用控制台日志,并且会话和变量可用(req.session在此处正确设置)。

全源:

var request = require('request');
var createError = require('http-errors');
var path = require('path');
var cookieParser = require('cookie-parser');
var router = express.Router();
var session = require("express-session")({secret: 'cookie secret',
resave: false,
saveUninitialized: true,
cookie: { secure: true }});
var myClientId = "my id";
var myClientSecret = "my secret"

router.use(session)
router.use((req,res,next)=>{console.log(req.session);next()});

router.get("/requestsignin", function(req,res,next)
{
  var scopes="playlist-read-collaborative playlist-modify-public playlist-read-private playlist-modify-private";
  res.redirect('https://accounts.spotify.com/authorize' +
  '?response_type=code' +
  '&client_id=' + myClientId +
  (scopes ? '&scope=' + encodeURIComponent(scopes) : '') +  
  '&redirect_uri=' + encodeURIComponent("http://www.localhost:8080"+res.locals.pathPrefix+"/afterSignIn"));
});

router.get("/afterSignIn", function(req, res)
{
  if(req.session.loggedIn) res.redirect(res.locals.pathPrefix+"/listofplaylists");
  else if(true)
  {
    var code = req.query.code
    if(!code) res.redirect(res.locals.pathPrefix);
    else
    {
      req.session.authCode = code;
      var clientServerOptions = 
      {
        url: "https://accounts.spotify.com/api/token",
        form: 
        {
          grant_type : "authorization_code",
          code: code,
          redirect_uri:"http://www.localhost:8080"+res.locals.pathPrefix+"/afterSignIn"
        },
        headers:
        {
          'Authorization' : 'Basic ' + (new Buffer(myClientId+":"+myClientSecret).toString("base64"))
        },
        json: true
      };
      request.post(clientServerOptions, (err, postres, body) => onReplyToAuth(req,res,err,postres,body));
    }

  }
  else
  {
    res.redirect(res.locals.pathPrefix);
  }
});


function onReplyToAuth(req,res,err,postres,body)
{
  if(!err)
  {
    req.session.loggedIn = true;
    req.session.loggingIn = false;
    req.session.accessToken = body.access_token;
    req.session.refreshToken = body.refresh_token;  
    res.redirect(res.locals.pathPrefix+"/listofplaylists");
  }
  else
  {
    res.redirect(res.locals.pathPrefix);
  }
}

function requestSpotifyData(url,req, callback)
{
  var authOptions = 
  {
    url:url,
    headers:
    {
      'Authorization':"Bearer " + req.session.accessToken
    },
    json : true
  }
  request.get(authOptions,callback);
}

router.get("/listofplaylists", function(req,res,next)
{
  if(!req.session.loggedIn)
  {
    res.redirect(res.locals.pathPrefix)
  }
  else
  {
    requestSpotifyData("https://api.spotify.com/v1/me/playlists?limit=50",req,(err,postres,body) =>
    {
      res.render("listOfplaylists",
      {
        playlists : body.items
      });
    });
  }

});



/* GET home page. */
router.get('/', function(req, res, next) {
  res.render('index', { title: 'Express' });
});




module.exports = router;

Nodemon app.js调试(请注意,代码在获取日志之前运行(上面的代码对应于请求):

Session {
  cookie: {
    path: '/',
    _expires: null,
    originalMaxAge: null,
    httpOnly: true,
    secure: true
  }
}
GET /spotify/requestsignin 302 18.590 ms - 628
Session {
  cookie: {
    path: '/',
    _expires: null,
    originalMaxAge: null,
    httpOnly: true,
    secure: true
  }
}
(node:1596) [DEP0005] DeprecationWarning: Buffer() is deprecated due to security and usability issues. Please use the Buffer.alloc(), Buffer.allocUnsafe(), or Buffer.from() methods instead.
{
  access_token: 'access token',
  token_type: 'Bearer',
  expires_in: 3600,
  refresh_token: 'refresh token',
  scope: 'playlist-read-private playlist-read-collaborative playlist-modify-private playlist-modify-public'
}
Before saving:
Session {
  cookie: {
    path: '/',
    _expires: null,
    originalMaxAge: null,
    httpOnly: true,
    secure: true
  },
  authCode: 'auth code',
  loggedIn: true,
  loggingIn: false,
  accessToken: 'access token',
  refreshToken: 'refresh token'
}
After saving:
Session {
  cookie: {
    path: '/',
    _expires: null,
    originalMaxAge: null,
    httpOnly: true,
    secure: true
  },
  authCode: 'auth code',
  loggedIn: true,
  loggingIn: false,
  accessToken: 'access token',
  refreshToken: 'refresh token'
}
GET /spotify/afterSignIn?code=auth code 302 141.181 ms - 92
Session {
  cookie: {
    path: '/',
    _expires: null,
    originalMaxAge: null,
    httpOnly: true,
    secure: true
  }
}
GET /spotify/listofplaylists 302 6.726 ms - 60
Session {
  cookie: {
    path: '/',
    _expires: null,
    originalMaxAge: null,
    httpOnly: true,
    secure: true
  }
}
GET /spotify/ 304 238.770 ms - -
GET /spotify/stylesheets/style.css 304 1.629 ms - -
Session {
  cookie: {
    path: '/',
    _expires: null,
    originalMaxAge: null,
    httpOnly: true,
    secure: true
  }
}
GET /spotify/ 304 15.980 ms - -

感谢您的帮助!

node.js ajax express express-session
2个回答
0
投票

我不确定这是否是问题所在,但有可能在会话完全保存在res.redirect函数中之前调用了onReplyToAuth,您可能想尝试调用req.session.save然后传递一个会话保存后将重定向的回调函数。

req.session.loggedIn = true;
req.session.loggingIn = false;
req.session.accessToken = body.access_token;
req.session.refreshToken = body.refresh_token;  
req.session.save(function(err) {
  // session saved
  res.redirect(res.locals.pathPrefix+"/listofplaylists");
})

希望对您有帮助。


0
投票

当我在忙着更改我的会话设置时,>

var session = require("express-session")({secret: 'secret`376712',
resave: false,
saveUninitialized: true,
cookie: { secure: true}});

to

var session = require("express-session")({secret: 'secret`376712',
resave: false,
saveUninitialized: true,
cookie: { secure: false }});

并且我获得了具有所需输出的播放列表列表(不再重置会话)。我认为这是一个解决办法,因为与服务器的连接是HTTP而不是HTTPS,因此不发送cookie。但是我对此不确定。

非常感谢其他与我一起思考的人!

PS:我将尝试更新此帖子,以实现其他人的最佳可达性。

© www.soinside.com 2019 - 2024. All rights reserved.