首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >app.get()如何处理服务器文件?

app.get()如何处理服务器文件?
EN

Stack Overflow用户
提问于 2019-07-26 07:34:45
回答 2查看 93关注 0票数 1

我试图理解在网页之间切换时,app.get()在调用函数时是如何工作的。

我已经创建了一个用户登录页面,它为用户分配一个令牌并在函数中检查它。

我使用app.post('/login', login);调用登录函数,该函数将用户对象发送到服务器。创建令牌后,我希望在检查令牌后在函数中呈现下一个页面。(参见下面的代码)

然而,我并不真正理解app.get('/', checkToken, getProfilePage)是如何被调用的。因为我不认为它会被称为。

我看过一些解释HTTP请求的网站,但我很难找出它们在app.js中是如何链接在一起的。

App.js

代码语言:javascript
运行
复制
app.post('/login', login);
app.get('/', authorize.checkToken, getProfilePage);

function login(req, res, next) {
 userService.login(req.body, (err, user) => {
    if (err) {
        res.redirect('error.ejs');
        console.log(error.message);
    }
    console.log(user);
    if (!user) {
      res.status(400).json({ success: false, message: 'Username or 
 password is incorrect' });
    }
    else {
      res.json(user);
    }
    })
}

下一个登录函数分配令牌,并在上面用作中间件:

代码语言:javascript
运行
复制
function login({ username, password }, callback) {
grabUsers((err, users) => {
    let user = users.find(u => u.username === username && u.password 
=== password);
    if (user) {
        const token = jwt.sign({ username: username }, config.secret, 
            { expiresIn: '24h'
        }
        );
        const { password, ...userWithoutPassword } = user;
        user = {
            ...userWithoutPassword,
            success: true,
            message: 'Authentication successful!',
            token: token
        }
    };  
    callback(null,user);
    })

}

authorize.js内幕

代码语言:javascript
运行
复制
let jwt = require('jsonwebtoken');
const config = require('./config.js');

let checkToken = (req, res, next) => {
    console.log("check token running...");
  let token = req.headers['x-access-token'] || 
 req.headers['authorization']; // Express headers are auto 
 converted to lowercase
  if (token.startsWith('Bearer ')) {
    // Remove Bearer from string
    token = token.slice(7, token.length);
  }

 if (token) {
   jwt.verify(token, config.secret, (err, decoded) => {
   if (err) {
    return res.json({
      success: false,
      message: 'Token is not valid'
    });
  } else {
    req.decoded = decoded;
    next();
  }
   });
  } else {
 return res.json({
  success: false,
  message: 'Auth token is not supplied'
 });
  }
};

module.exports = {
 checkToken: checkToken }

getProfilePage函数:

代码语言:javascript
运行
复制
module.exports = {
    getProfilePage: (req, res) => {
        res.render('profile.ejs');
    }
}

因此,我的登录表单将发布到/login,一旦验证通过,我将检查令牌,然后调用getProfilePage。但是,在发布和验证登录数据之后,如何调用app.get()呢?

EN

回答 2

Stack Overflow用户

发布于 2019-07-26 07:43:17

你没有从你的应用程序调用路由,你需要做的是重定向到它: res.redirect('/');

票数 0
EN

Stack Overflow用户

发布于 2019-07-26 08:01:04

我认为您尝试对用户进行身份验证的方式存在问题。在我看来,你在authorization头中发送了一个令牌,这是你访问API时的一种常见做法。虽然不确定如何/何时生成令牌并设置此标头...

无论如何,这种方法对于授权是很好的,但是对于身份验证就不是那么好了。

/login请求成功后,您应该设置身份验证cookie (用户会话)。为简单起见,您可以只生成一个编码了userId的JWT,并将其用作此cookie值(让我们称其为user-session)。

现在,每次用户发出请求时,cookie将随其一起发送,您可以从该JWT解码userId。(同样的事情,但现在您将从req.cookies['user-session']而不是req.headers['authorization']获取令牌)。

但是在发布和验证登录数据之后,如何调用app.get()呢?

如果您正在使用AJAX (即window.location.replace('/')),则可以在收到成功的/login响应后立即从客户端导航到此页面;如果您在没有使用AJAX的情况下提交表单,则可以在成功登录时使用res.redirect('/')而不是res.json(user)

重定向强制浏览器立即向您指定的网址发出另一个请求,到那时您已经设置了user-session cookie,即您将能够检索userId并返回正确的个人资料页面。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57211350

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档