JWT Token 不会在 Heroku 上生成

Posted

技术标签:

【中文标题】JWT Token 不会在 Heroku 上生成【英文标题】:JWT Token will not generate on Heroku 【发布时间】:2019-02-14 10:29:23 【问题描述】:

这太奇怪了。在本地主机上运行我的 Node.js 应用程序时,我一切正常。但是在部署到 Heroku 之后,它总是给我 400 Bad Request 和一个空白的响应正文 。我使用相同的邮递员请求测试了两个环境,只更改了基本 URL。

这是我的发帖方法:

app.post('/users', (req, res) => 
var body = _.pick(req.body, ['email', 'password', 'f_name', 'l_name', 'phone', 'address']);
var user = new User(body);

user.save().then(() => 
  return user.generateAuthToken();
).then((token) => 
  res.header('x-auth', token).send(user);
).catch((err) => 
  res.status(400).send(err);
);
);

最后,我发现每当我在发布新用户时尝试创建令牌时,我的 localhost 数据库确实可以工作,但在 Heroku 环境中没有创建令牌。

这意味着这个函数是最可疑的:

UserSchema.methods.generateAuthToken = function () 
var user = this;
var access = 'auth';
var token = jwt.sign(_id: user._id.toHexString(), access, process.env.JWT_SECRET).toString();

user.tokens = user.tokens.concat([access, token]);

return user.save().then(() => 
    return token;
).catch((err) => 
    return err;
);
;

我不明白的是,为什么这会对部署环境产生任何影响?我怎么知道 Heroku 内部出了什么问题?在本地运行时,我们通常会得到那些错误日志,heroku 日志没有任何好处。尽管我试图捕捉错误并返回它们,但我的邮递员响应正文没有返回任何内容。

感谢您的帮助!

【问题讨论】:

你应该在 Heroku 设置 JWT_SECRET。 【参考方案1】:

这个问题已经有一段时间了,但今天我遇到了类似的问题。在我这边,它原来是我用于 JWT 的秘密,它在我的 .env 文件中,它没有上传到 github 并部署在 herokuapp 服务器上。 如果您使用任何秘密并想在 heroku 上部署,您可以通过 heroku cli 将它们加载到变量中。 在我的情况下 heroku config:set JWT_SECRET='mysecret!@'

【讨论】:

【参考方案2】:

您是否检查过您在 Heroku 中设置的环境变量是否被正确接收和解析?我注意到在我的部署中,我使用 rsa 加密作为我的秘密,新行字符没有被识别。

本地

-----BEGIN PUBLIC KEY-----\nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAz7pZEypvrFJCDshsbOam\nj9bmy/dXnUOyCo5b3xSvvTNIoFAC5ePXozCD/5Byih1JB6ZYE6OceEW6oArkPzZO\nl8bFBlqV9k30oerMtVei18+CfF/uFLWlJXs9FvXrRTKtsL43OmpLCH3LdzK9/+Zq\nhEx/TShp3JudUWuRW8ALqrBd8QW5CWJHYozYVaIpFzwJ9KW6fJ9GpZfcToCOquLW\no8iINnAovXmvcAtdmzgIqoucD988f9oerll/CubJLy2rOiyeRvsAYouoefoyQZWN\n8IYPlnb5IB6Z7qnVL6rZz44dAjVwS3uARW3lxpfeZn3TN7wpPkBssGBF0OSEHNrX\nVwIDAQAB\n-----END PUBLIC KEY-----

将被记录为

-----BEGIN PUBLIC KEY-----
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAz7pZEypvrFJCDshsbOam
j9bmy/dXnUOyCo5b3xSvvTNIoFAC5ePXozCD/5Byih1JB6ZYE6OceEW6oArkPzZO
l8bFBlqV9k30oerMtVei18+CfF/uFLWlJXs9FvXrRTKtsL43OmpLCH3LdzK9/+Zq
hEx/TShp3JudUWuRW8ALqrBd8QW5CWJHYozYVaIpFzwJ9KW6fJ9GpZfcToCOquLW
o8iINnAovXmvcAtdmzgIqoucD988f9oerll/CubJLy2rOiyeRvsAYouoefoyQZWN
8IYPlnb5IB6Z7qnVL6rZz44dAjVwS3uARW3lxpfeZn3TN7wpPkBssGBF0OSEHNrX
VwIDAQAB
-----END PUBLIC KEY-----

但在 Heroku 上,它会完全按照我提供的方式记录——所有内容都出现在一行上,包括换行符。使用显式格式设置我的 Heroku 环境变量似乎可以解决我的签名问题。

【讨论】:

【参考方案3】:

我的猜测是 Heroku 环境中没有安装 JWT 库。请尝试在 Heroku 环境中执行npm install

【讨论】:

感谢您的回复,但有没有办法做到这一点?我以为当我使用git push heroku master 时会自动安装 npm 包 我认为情况并非如此。看看您是否可以通过 SSH 访问您的服务器。如果没有,也许 Heroku CLI 工具可以提供帮助。但如果情况变得更糟,请将您的 node_modules 包含在您的提交中,然后使用 Heroku。这是非常不鼓励的,但值得一试。

以上是关于JWT Token 不会在 Heroku 上生成的主要内容,如果未能解决你的问题,请参考以下文章

Json Web Token (JWT) 究竟是如何减少人在循环攻击的?

使用JWT 进行基于 Token 的身份验证方法

JWT 功能在本地有效,但在 heroku 上无效

身份验证(JWT)在本地有效,但在 Heroku 无效?

SpringBoot集成JWT

基于Token登录验证与统一拦截(一个JWT的Demo)