JsonWebToken |获取请求验证

时间:2017-03-23 10:09:01

标签: node.js express socket.io jwt

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

如果用户已登录并手动打开用户仪表板链接,则服务器将收到get-request。我如何验证令牌呢?我无法找到在get-event中访问它的方法。

令牌创建:

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(这就是我选择token-auth的原因)。此外,我希望能够从简单的发出访问令牌(如果它存储在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>

正文的控制台输出是:

BODY: undefined
BODY: [object Object]
BODY: undefined
BODY: undefined

我对node.js和网络编码本身很新。所以请耐心等待我。

2 个答案:

答案 0 :(得分:2)

从客户端到服务器发送json Web令牌的最着名的技术是在不使用会话的情况下,将它们发送到请求标头。

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

<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<script src="https://maps.googleapis.com/maps/api/js"></script>
<select id="location">
  <option>New York, NY</option>
  <option>Newark, NJ</option>
  <option>Philadelphia, PA</option>
</select>
<div id="map_canvas"></div>

然后,您可以在以下中间件中验证json Web令牌:

$.ajax({
  ...
  beforeSend: function(request) {
    request.setRequestHeader("Access-Token", jsonWebToken);
  }
  ...
});

您可以从应用程序中调用中间件,如:

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();
        }
    }
}

答案 1 :(得分:2)

您缺少的是将令牌发送到服务器并获得身份验证的方法。由于您使用的是HTTP,因此您有很多可能的方法来执行此操作 最常见的两个是cookie和本地存储:

缓存

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

  • 使用已知技术,因此您可能有更多关于如何操作的文档
  • 应该使用所有HTTP工具

localStorage的

ardilgulez更详细,逻辑是服务器有两个端点。一个人不需要身份验证,并提供一个检查JWT的LocalStorage的网页,并在对第二个服务器端点的AJAX调用中使用它,该端点经过身份验证并返回数据。一旦页面有数据,它就会编辑HTML以打印它们。 这样做的另一个好处是,您提供的端点只提供数据,所以当有一天您想要创建另一个客户端时,请将其作为&#34; v2&#34;对于您的网站,您不需要触摸服务器端。

  • 您有一个类似于REST的端点,它只获取未来客户可能使用的相关数据。
  • 根据您有效发送令牌的方式,配置HTTP工具可能比使用Cookie更容易

另请查看我们在chat

中的讨论