【问题标题】:JsonWebToken | get-request validationJsonWebToken |获取请求验证
【发布时间】:2017-08-15 19:46:57
【问题描述】:

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

如果用户登录并手动打开用户仪表板链接,服务器将收到一个获取请求。那我该如何验证令牌呢?我找不到在 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 中,这是可能的)。

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

非常感谢!

根据 cmets 编辑:

服务器部分

// 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 和网络编码本身非常陌生。所以请耐心等待我。

【问题讨论】:

  • 你如何创建你的令牌?你有任何用于创建它们的 npm 模块吗? (或)你以自己的方式做?
  • jwt 添加了一个标签,因为我正在使用 jsonWebTokens。添加一些代码。
  • 如何发送请求?
  • @DrakaSAN 检查我的编辑。贴出我目前得到的代码。

标签: node.js express socket.io jwt


【解决方案1】:

在不使用会话的情况下从客户端向服务器发送 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 令牌的最广泛使用的方法。如果 api 被 Web 应用程序以外的其他东西使用,例如原生移动应用程序,您可以将令牌存储在共享首选项或 sqlite 数据库(或那些等效的 ios)中。
  • 我是网络编码新手,所以只是为了我的理解:如果我设置请求标头,它将应用于所有未来的请求?无法想象。登录,切换到谷歌,然后将仪表板的链接粘贴到浏览器的 url 栏中呢?浏览器不应该在没有任何修改的情况下启动请求吗?
  • 我说的是open a bookmark from the browser 上下文中的请求。应该如何在那里触发任何脚本?
  • 标头仅适用于单个请求,而不适用于所有未来的请求,因此您必须将标头添加到/dashboard端点的每个请求中。如果您想在从书签打开/dashboard 时自动应用令牌,您可以在触发ajax 请求并在ajax 代码中设置标头时从本地存储中获取json Web 令牌。
【解决方案2】:

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

Cookies

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

专业版:

  • 使用已知技术,因此您可能有更多关于如何做到这一点的文档
  • 应该适用于所有 HTTP 工具

本地存储

ardilgulez 更详细地说,逻辑是服务器有两个端点。一个不需要身份验证,并提供一个网页来检查 JWT 的 LocalStorage,并在对第二个服务器端点的 AJAX 调用中使用它,该端点经过身份验证并返回数据。页面拥有数据后,它会编辑 HTML 以打印它们。 这样做的另一个好处是你提供了只提供数据的端点,所以当你想要创建另一个客户端时,无论是你网站的“v2”,你都不需要接触服务器端。

专业版:

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

也可以在chat查看我们的讨论

【讨论】:

  • 将令牌存储在最终用户可以访问的存储或 cookie 中是否安全?
  • @JyotmanSingh 是的,因为除非服务器配置不当,否则它很快就会过期。此外,它不应该有任何明智的加密,所以那里也没有问题。与往常一样,它是一种工具,而且工具与您使用它的方式一样安全。但可以肯定的是,如果有人将 SSN 或信用卡信息放入 JWT,这本身就是一个安全漏洞。或者如果令牌存在几天......
猜你喜欢
  • 2018-12-19
  • 1970-01-01
  • 2013-07-23
  • 1970-01-01
  • 1970-01-01
  • 2015-11-14
  • 1970-01-01
  • 2021-01-11
  • 2018-10-18
相关资源
最近更新 更多