SyntaxError: Unexpected end of JSON input - CryptoJS

13/02/2024

0

Estou recebendo esse erro ao fazer solicitações via axios para meu servidor express, onde passo um payload criptografado e tento descriptografá-lo no backend, porém, sem resultados.

Abaixo estão os códigos de front-end e back-end

OBS: No meu payload, a string está sendo passada normalmente, porém, no backend, meu "req.body" simplesmente não captura a string de forma alguma, e por conta disso não consigo passá-la para minha função "decrypt", e então recebo esse erro.

Alguém pode me ajudar? Não consigo encontrar nada na internet sobre isso.

//Front

export const cryptoLogin = defineStore(''cryptologin'', {
actions: {
encryptData(data) {
const ciphertext = CryptoJS.AES.encrypt(JSON.stringify(data), ''fJ7#yM1(xY6#jR6:'').toString();
return ciphertext;
}
}
})

async loginSend() {
const dados = [{
email: this.email,
password: this.password
}]
await axios.post(''http://localhost:3000/login'', cryptoLogin().encryptData(dados))
.then((Response) => {
const token = Response.data.token
localStorage.setItem(''x-access-token'', token)

if (Response.data.success) {
this.$router.push(''/index'')

this.$q.notify({
color: ''green-4'',
textColor: ''white'',
icon: ''cloud_done'',
message: ''Login Autorizado''
})
}
else {
this.reset()
this.$q.notify({
color: ''red'',
textColor: ''white'',
icon: ''warning'',
message: ''Credenciais inválidas''
})
}
})
},

//Back

function decrypt(data) {
var bytes = CryptoJS.AES.decrypt(data, ''fJ7#yM1(xY6#jR6:'');
var decryptedData = JSON.parse(bytes.toString(CryptoJS.enc.Utf8));
return decryptedData
}
module.exports = decrypt

app.post(''/login'', async (req, res) => {
const data = req.body
console.log(data);
const decryptedData = await decrypt(data)
const { email, password } = decryptedData
const logado = await Cliente.findOne({ where: { email, password } })
const id = await Cliente.findAll({ attributes: [''id''], where: { email, password } })

if (logado) {
const token = jwt.sign({ userId: id[0].id }, segredo, { expiresIn: 86400 })
res.json({ success: true, token })
}
else {
res.status(401).end()
}
})
Lucas

Lucas

Responder

Posts

17/02/2024

Mikhael

Estou recebendo esse erro ao fazer solicitações via axios para meu servidor express, onde passo um payload criptografado e tento descriptografá-lo no backend, porém, sem resultados.

Abaixo estão os códigos de front-end e back-end

OBS: No meu payload, a string está sendo passada normalmente, porém, no backend, meu "req.body" simplesmente não captura a string de forma alguma, e por conta disso não consigo passá-la para minha função "decrypt", e então recebo esse erro.

Alguém pode me ajudar? Não consigo encontrar nada na internet sobre isso.

//Front

export const cryptoLogin = defineStore(''cryptologin'', {
actions: {
encryptData(data) {
const ciphertext = CryptoJS.AES.encrypt(JSON.stringify(data), ''fJ7#yM1(xY6#jR6:'').toString();
return ciphertext;
}
}
})

async loginSend() {
const dados = [{
email: this.email,
password: this.password
}]
await axios.post(''http://localhost:3000/login'', cryptoLogin().encryptData(dados))
.then((Response) => {
const token = Response.data.token
localStorage.setItem(''x-access-token'', token)

if (Response.data.success) {
this.$router.push(''/index'')

this.$q.notify({
color: ''green-4'',
textColor: ''white'',
icon: ''cloud_done'',
message: ''Login Autorizado''
})
}
else {
this.reset()
this.$q.notify({
color: ''red'',
textColor: ''white'',
icon: ''warning'',
message: ''Credenciais inválidas''
})
}
})
},

//Back

function decrypt(data) {
var bytes = CryptoJS.AES.decrypt(data, ''fJ7#yM1(xY6#jR6:'');
var decryptedData = JSON.parse(bytes.toString(CryptoJS.enc.Utf8));
return decryptedData
}
module.exports = decrypt

app.post(''/login'', async (req, res) => {
const data = req.body
console.log(data);
const decryptedData = await decrypt(data)
const { email, password } = decryptedData
const logado = await Cliente.findOne({ where: { email, password } })
const id = await Cliente.findAll({ attributes: [''id''], where: { email, password } })

if (logado) {
const token = jwt.sign({ userId: id[0].id }, segredo, { expiresIn: 86400 })
res.json({ success: true, token })
}
else {
res.status(401).end()
}
})
Para resolver o erro você precisa que o Content-Type na sua solicitação axios está configurado corretamente para application/json

await axios.post('http://localhost:3000/login', cryptoLogin().encryptData(dados), {
headers: {
'Content-Type': 'application/json'
}
})

Pelo que percebi você está usando JSON.stringify antes de criptografar os dados, então faça isso:

const dados = {
email: this.email,
password: this.password
};

await axios.post('http://localhost:3000/login', cryptoLogin().encryptData(dados), {
headers: {
'Content-Type': 'application/json'
}
})

e outra coisa pelo que percebi você está tentando acessar req.body, mas a partir do seu código, parece que você está usando data diretamente. Escreva o seguinte código para acessar data em vez de req.body

app.post('/login', async (req, res) => {
const data = req.body; // ou const data = req.body.data; dependendo da estrutura do seu payload
console.log(data);

// Resto do código...
});

Mas preste atençao na hora que o Express está configurado para analisar JSON. Adicione o middleware express.json() antes das rotas, escreva isso:

const express = require('express');
const app = express();

app.use(express.json());

Espero ter ajudado!
Responder

Assista grátis a nossa aula inaugural

Assitir aula

Saiba por que programar é uma questão de
sobrevivência e como aprender sem riscos

Assistir agora

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar