首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >JsonWebToken /get-请求验证

JsonWebToken /get-请求验证
EN

Stack Overflow用户
提问于 2017-03-23 10:09:01
回答 2查看 305关注 0票数 1

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

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

象征性-创造:

代码语言:javascript
复制
var token = jwt.sign({ Username: 'test' }, app.get('tokenPass'));

// This token is either send as response or via emitting.

在客户端,我将其存储为

代码语言:javascript
复制
$window.sessionStorage = token;

我的问题是:

代码语言:javascript
复制
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(这就是我选择令牌-auth的关键)。另外,我希望能够从简单的发射端访问令牌(如果它存储在SessionStorage中,这是可能的)。

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

非常感谢!

根据评论:编辑:

服务器-部件

代码语言:javascript
复制
// 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 });
});

客户部分

代码语言:javascript
复制
<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>

主体的控制台输出是:

代码语言:javascript
复制
BODY: undefined
BODY: [object Object]
BODY: undefined
BODY: undefined

我对node.js和网页编码本身非常陌生。所以请对我耐心点。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-03-23 11:01:28

当然,在不使用会话的情况下,从客户机发送到服务器的json web令牌最著名的技术是在请求头上发送它们。

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

代码语言:javascript
复制
$.ajax({
  ...
  beforeSend: function(request) {
    request.setRequestHeader("Access-Token", jsonWebToken);
  }
  ...
});

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

代码语言:javascript
复制
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();
        }
    }
}

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

代码语言:javascript
复制
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.
});
票数 2
EN

Stack Overflow用户

发布于 2017-03-23 13:11:29

您缺少的是一种将令牌发送到服务器并获得身份验证的方法。因为您正在使用HTTP,所以您有很多可能的方法来做到这一点。

最常见的两个是cookie和本地存储:

曲奇饼

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

专业:

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

LocalStorage

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

专业:

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

也请查看我们在chat中的讨论

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

https://stackoverflow.com/questions/42972943

复制
相关文章

相似问题

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