Saya memiliki aplikasi node.js. Saya menggunakan Json Web Token untuk otorisasi. Ketika saya Login dengan pengguna yang ada di database saya, itu membuat token untuk pengguna. Tapi saya bisa menggunakan token itu untuk pengguna lain dan itu juga berfungsi lagi. Saya perlu memiliki token yang berbeda untuk semua pengguna dan saya tidak boleh menggunakan token satu pengguna untuk pengguna lain. (Saya tidak memiliki internet di komputer kerja saya jadi saya tidak dapat menulis kode saya di komputer saya di sini maaf tentang itu)

Ini adalah verifikasi-token.js saya (middleware):

const jwt = require("jsonwebtoken");

module.exports = (req, res, next) => {
  try {
    const token = req.headers.authorization.split(" ")[1];
    const decodedToken = jwt.verify(token, "secret_key");
    req.userData = decodedToken;
    next();
  } catch (error) {
    return res.status(401).send({
      message: "Auth failed"
    });
  }
};

Dan ini kode login saya (saya membuat token di sini) jika kata sandi benar:

const token = jwt.sign(
  {
    email: user.email,
    password: user.password
  },
  "secret_key",
  {
    expiresIn: "2h"
  }
);

return res.status(200).send({ message: "success", token: token });

Dan di app.js:

const checkAuth = require('../middleware/checkauth');
router.get('/api/company',checkAuth,companyController.list);

Saya berharap satu token hanya untuk satu pengguna, dan untuk setiap login itu harus membuat token baru untuk semua pengguna. Ada saran?

0
Minel Aydın 30 Oktober 2019, 20:49

1 menjawab

Jawaban Terbaik

Anda memasukkan email di badan token Anda; mengapa tidak menyertakan ID pengguna sebagai klaim (bidang)? Saat Anda memverifikasi token, jika berhasil, itu akan mengembalikan tubuh kepada Anda, jadi Anda akan tahu untuk pengguna mana token itu dibuat dan tolak jika bukan orang yang membuat permintaan.

Untuk memastikan dua orang tidak menggunakan token yang sama pada saat yang sama, Anda dapat menyimpan daftar setiap token yang valid saat Anda membuatnya, dan saat token kedaluwarsa atau dicabut (misalnya, saat pengguna keluar atau melaporkan penipu, jika sampai sejauh itu) hapus dari daftar. Saat verifikasi, jika token tidak ada dalam daftar, jangan repot-repot decoding, langsung tolak saja.

Jika Anda memberikan token Anda jendela kedaluwarsa yang cukup kecil (saya percaya rekomendasinya adalah membuatnya bertahan tidak lebih dari 1 jam), Anda tidak perlu terlalu khawatir tentang hal-hal seperti itu.

EDIT Untuk memperjelas, Anda tidak akan pernah tahu dengan pasti bahwa orang yang memberi Anda token adalah orang yang mereka klaim. Anda hanya tahu apakah server Anda membuat token dan apakah token saat ini valid. Jika Anda benar-benar ingin mencegah serangan replay (yaitu, pastikan benar-benar tidak ada cara bagi dua orang untuk menggunakan token yang sama sekaligus), Anda harus membuat token baru setiap kali token digunakan. Jika Anda menyimpan daftar putih yang saya sebutkan di atas, regenerasi ini memastikan setiap token menjadi tidak valid segera setelah digunakan sekali.

Anda juga dapat, agar lebih percaya diri, menyertakan klaim jti di badan token; ini adalah bidang yang dimaksudkan untuk diisi dengan nilai unik acak setiap kali token dibuat, sehingga Anda dapat melacak jti yang telah Anda terima dan tidak mengizinkan yang sama masuk lebih dari sekali. Ini hampir sama dengan hanya melacak token.

3
IceMetalPunk 30 Oktober 2019, 18:28