在标头中传递 JWT

Posted

技术标签:

【中文标题】在标头中传递 JWT【英文标题】:Pass JWT in Header 【发布时间】:2018-06-26 05:13:16 【问题描述】:

我正在使用 NodeJs 学习 JWT。我被困在通过标头中的 JWT 实际上我不知道该怎么做。

index.js 文件

var express = require('express'),
 app = express(),
 routes = require('./routes'),
 bodyParser = require('body-parser'),
 path = require('path'),
 ejs = require('ejs'),
 jwt = require('jsonwebtoken');

app.use(bodyParser.urlencoded( extended: false )); 
app.use(bodyParser.json());

app.set('views', __dirname + '/views');
app.set('view engine', 'ejs');

app.post('/home',routes.loginUser);

app.get('/', function(req, res) 
  res.render('index');
);

app.get('/home',function(req, res) 
  jwt.verify(req.token, 'qwertyu6456asdfghj', function(err, data) 
    if (err) 
      res.sendStatus(403);
     
  );
);

 app.listen(3000,function()
  console.log("Server running at Port 3000");
);

路由/index.js 文件

var  jwt = require('jsonwebtoken');

exports.home = function(req, res)
  res.render('home',error: false);
;

exports.loginUser = function(req, res) 
    var uname = req.body.Username;
    var pwd = req.body.Password;

    if(uname && pwd === 'admin')
        res.render('home');

    var token = jwt.sign( user: uname , 'qwertyuiopasdfghj');
    console.log('Authentication is done successfully.....');
    console.log(token);
    

    response.json(
        authsuccess: true,
        description: 'Sending the Access Token',
        token: token
    );
;

当我运行应用程序时,我在console.log 中获取令牌,但是 如何在 header 中传递令牌并将其存储在浏览器的 localStorage 中?

【问题讨论】:

这发生在客户端。你是从网络上调用你的快递应用程序吗?安卓? ios?每个客户端都需要处理令牌并将其作为以下标头附加到请求:“Authorization”:“Bearer ”(“Bearer”只是将其与护照一起使用的约定) @ChicoDelaBarrio 我知道我该怎么做? 这取决于客户。我建议从使用邮递员link 开始测试您的请求 当我使用 res.json( authsuccess: true, description: 'Sending the Access Token', token: token ); 发送响应时,我收到此错误 -> Error [ERR_HTTP_HEADERS_SENT]: Cannot set headers after they are sent to the client 这是因为你不能在 'resposnse.render' 之后使用 'respinse.json()'。您只能回复一次。此错误与 JWT 无关 【参考方案1】:

所以你想将令牌发送到前端而不是正文。

推荐的方法是使用 cookie。可以在cookie中设置token,可以在前端和后端自动访问。

res.cookie('tokenKey', 'ajsbjabcjcTOKENajbdcjabdcjdc');

使用授权标头也是一个好方法,但同样,在前端,您必须从标头中获取令牌,然后保存在 localStorage 或 cookie 中,如果使用 cookie,则不必这样做。

res.header(field [, value]);

【讨论】:

谢谢,但我在一周前通过res.cookie('auth',token);解决了这个问题。 对不起!它没有标记为已回答,所以我想提供一些帮助。 NVM【参考方案2】:

正如@ChicoDelaBarrio 告诉您的,这取决于客户。 Postman 是开始检查后端的好地方。但是在你的服务器工作之后,你必须开始在你的客户端工作。

如果你想要一个关于 Node.js 中 JWT 的完整后端示例,包括 Refresh 令牌,我向你推荐这篇文章:Refresh token with JWT authentication in Node.js 可能您可以重用大部分代码。在这种情况下,header 不是用 BEARER 创建的,而是在开头用 JWT 创建的,但它的工作原理是一样的

【讨论】:

谢谢,我会调查的。

以上是关于在标头中传递 JWT的主要内容,如果未能解决你的问题,请参考以下文章

JWT入门简介

在 jQuery AJAX GET 调用中传递请求标头

JWT相关介绍

在标头中传递 JWT

我是不是在发布请求的标头或正文中传递身份令牌?

如何在 SAP NetWeaver Mobile First 适配器中传递标头