Node.js JsonWebToken |获取请求验证

Node.js JsonWebToken |获取请求验证,node.js,express,socket.io,jwt,Node.js,Express,Socket.io,Jwt,我目前正在尝试构建一个基于令牌的简单登录系统。我有一个简单的登录表单,可以将凭证发送到服务器。创建令牌也对我有用 如果用户登录并手动打开用户仪表板链接,服务器将收到get请求。那么我如何验证令牌?我无法在get事件中找到访问它的方法 令牌创建: var token = jwt.sign({ Username: 'test' }, app.get('tokenPass')); // This token is either send as response or via emitting. 在

我目前正在尝试构建一个基于令牌的简单登录系统。我有一个简单的登录表单,可以将凭证发送到服务器。创建令牌也对我有用

如果用户登录并手动打开用户仪表板链接,服务器将收到get请求。那么我如何验证令牌?我无法在get事件中找到访问它的方法

令牌创建:

var token = jwt.sign({ Username: 'test' }, app.get('tokenPass'));

// This token is either send as response or via emitting.
在客户端,我将其存储为

$window.sessionStorage = token;
我的问题是:

app.get('/dashboard', function(req, res) {
    // req is not including the token
    // I cant deliver the dashboard without
    // validating that the requesting user
    // is logged in.
});
我想防止使用cookie(这就是我选择TokenAuth的原因)。我还希望能够从简单的emit访问令牌(如果它存储在SessionStorage中,这是可能的)

这是一个私人项目,所以如果需要的话,我不介意获得其他方法的想法。我感谢这里的一切帮助

非常感谢

根据评论进行编辑:

服务器部件

// Simply tried sending a token for testing purposes
// After a page-refresh I expected being able accessing it
router.get('/', auth, function(req, res) {
    // Sending the index.html
    res.sendFile(exp.get('views') + '/index.html');

    // Token is never delivered
    console.log('BODY: ' + req.body);
    console.log('BODY: ' + req.query);
    console.log('BODY: ' + req.query.token);
    console.log('BODY: ' + req.headers['x-access-token']);

    // New token is send here
    var token = jwt.sign({ username: 'testUser' }, 'SECRET');
    req.io.emit('token', { token: token });
});
客户部分

<script>
    $(function (){
        var socket = io();

        // Incoming token get sets to sessionStorage
        socket.on('token', function(data) {
            // Is raising and showing token.
            alert('token: ' + data.token);
            $window.sessionStorage.accessToken = data.token;
            $window.sessionStorage = data.token;
        });

        $('#logout').click(function (err){
            sessionStorage.token = null;
        });
    });
</script>


我对node.js和网络编码本身非常陌生。因此,请耐心等待。

从客户端向服务器发送json web令牌最著名的技术,当然不使用会话,就是在请求头上发送它们

在客户端进行ajax调用时,添加如下标题:

$.ajax({
  ...
  beforeSend: function(request) {
    request.setRequestHeader("Access-Token", jsonWebToken);
  }
  ...
});
然后,您可以在如下中间件中验证json web令牌:

const verifyMiddleware = function(req, res, next){
    const jsonWebToken = req.headers['Access-Token'];
    jwt.verify(jsonWebToken, function(err, user){
        if(err) {
          return res.status(401).send('Bad Auth');
        } else {
          req.user = user;
          next();
        }
    }
}
您可以从应用程序调用中间件,如:

app.get('/dashboard', verifyMiddleware, function(req, res) {
    // req is not including the token
    // I cant deliver the dashboard without
    // validating that the requesting user
    // is logged in.
});

当然,在不使用会话的情况下,将json web令牌从客户端发送到服务器的最广为人知的技术是在请求头上发送它们

在客户端进行ajax调用时,添加如下标题:

$.ajax({
  ...
  beforeSend: function(request) {
    request.setRequestHeader("Access-Token", jsonWebToken);
  }
  ...
});
然后,您可以在如下中间件中验证json web令牌:

const verifyMiddleware = function(req, res, next){
    const jsonWebToken = req.headers['Access-Token'];
    jwt.verify(jsonWebToken, function(err, user){
        if(err) {
          return res.status(401).send('Bad Auth');
        } else {
          req.user = user;
          next();
        }
    }
}
您可以从应用程序调用中间件,如:

app.get('/dashboard', verifyMiddleware, function(req, res) {
    // req is not including the token
    // I cant deliver the dashboard without
    // validating that the requesting user
    // is logged in.
});

您缺少的是将令牌发送到服务器并获得身份验证的方法。因为您使用的是HTTP,所以有很多可能的方法来实现这一点。
最常见的两种是cookie和本地存储:

曲奇饼 浏览器会自动将cookie发送到服务器,几乎所有HTTP工具都有发送cookie的方法。因此,您将令牌存储在cookie中,并在服务器端检查cookie的存在并验证其中的JWT

赞成的意见:
  • 使用已知的技术,因此您可能会有更多关于如何做到这一点的文档
  • 应与所有HTTP工具配合使用
本地存储 由ardilgulez更详细地描述,逻辑是服务器有两个端点。您不需要身份验证,并提供一个检查JWT的本地存储的web页面,并在对第二个服务器端点的AJAX调用中使用它,后者经过身份验证并返回数据。一旦页面有了数据,它就会编辑HTML以打印它们。 这样做的另一个好处是,您提供的端点只服务于数据,因此当有一天您想要创建另一个客户端时,无论它是您网站的“v2”,您都不需要接触服务器端

赞成的意见:
  • 您有一个类似REST的端点,它只获取相关数据,任何未来的客户端都可以使用
  • 根据您有效发送令牌的方式,配置HTTP工具可能比使用cookie更容易

另请查看我们在

中的讨论,您缺少的是将令牌发送到服务器并获得身份验证的方法。因为您使用的是HTTP,所以有很多可能的方法来实现这一点。
最常见的两种是cookie和本地存储:

曲奇饼 浏览器会自动将cookie发送到服务器,几乎所有HTTP工具都有发送cookie的方法。因此,您将令牌存储在cookie中,并在服务器端检查cookie的存在并验证其中的JWT

赞成的意见:
  • 使用已知的技术,因此您可能会有更多关于如何做到这一点的文档
  • 应与所有HTTP工具配合使用
本地存储 由ardilgulez更详细地描述,逻辑是服务器有两个端点。一个不需要身份验证,提供一个检查JWT本地存储的网页,并在对第二个服务器端点的AJAX调用中使用它,该端点经过身份验证并返回数据。一旦页面有了数据,它就会编辑HTML以打印它们。 这样做的另一个好处是,您提供的端点只服务于数据,因此当有一天您想要创建另一个客户端时,无论它是您网站的“v2”,您都不需要接触服务器端

赞成的意见:
  • 您有一个类似REST的端点,它只获取相关数据,任何未来的客户端都可以使用
  • 根据您有效发送令牌的方式,配置HTTP工具可能比使用cookie更容易

另请查看我们在

中的讨论,您如何创建代币?你有任何npm模块来创建它们吗?(或者)你用自己的方式来做吗?在我使用jsonWebTokens时,为jwt添加了一个标签。正在添加一些代码。如何发送请求?@DrakaSAN检查我的编辑。发布了我当前获得的代码。如何创建令牌?你有任何npm模块来创建它们吗?(或者)你用自己的方式来做吗?在我使用jsonWebTokens时,为jwt添加了一个标签。正在添加一些代码。如何发送请求?@DrakaSAN检查我的编辑。发布了我当前获得的代码。当需要在标头中发送令牌时,用户将在何处保存令牌?浏览器的本地存储是一个选项。事实上,这是存储json web令牌最广泛使用的方法。如果api被web应用程序以外的其他应用程序(如本机移动应用程序)使用,您可以将令牌存储在共享首选项或sqlite数据库(或与之类似的ios数据库)中。我是网络编码新手,因此仅就我的理解而言:如果我设置了请求头,它将应用于所有未来的请求?我无法想象。登录,切换到谷歌,然后将仪表板的链接粘贴到浏览器的url栏中,怎么样?浏览器不应该在不做任何修改的情况下启动请求吗?我是在
从浏览器打开书签的上下文中讨论请求的