JWT令牌将不会在Heroku上生成

时间:2018-09-10 02:00:39

标签: javascript node.js mongodb heroku jwt

这太奇怪了。在本地主机上运行Node.js应用程序时,一切正常。但是部署到Heroku之后,它总是给我400错误的请求和空白的响应正文{}。我用相同的邮递员请求测试了两种环境,只是更改了基本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日志则无济于事。尽管我尝试捕获错误并返回错误,但邮递员的回复正文却什么也没回来。

感谢您的帮助!

3 个答案:

答案 0 :(得分:0)

我的猜测是在Heroku环境中未安装JWT库。请尝试在Heroku环境中进行event.target

答案 1 :(得分:0)

您是否检查过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环境变量似乎可以解决我的签名问题。

答案 2 :(得分:0)

这个问题已经有一段时间了,但是今天我遇到了类似的问题。在我这边,事实证明,这是我用于JWT的秘密,它位于我的.env文件中,该文件未上载到github并部署在herokuapp服务器上。 如果您使用任何秘密并希望在heroku上进行部署,则可以通过heroku cli将它们加载到变量中。 就我而言, heroku config:set JWT_SECRET ='mysecret!@'