node.js - hvordan kan jeg få egenskapen fra resultatet av jwt.verify() metoden som allerede ble opprettet
I mitt node.js-prosjekt har jeg brukt TypeScript.
Jeg vil hente userId fra resultatet av jwt.verify(), men jeg fikk en feil.
Hvordan kan jeg fikse dette problemet? (Hvis jeg ikke bruker TypeScript, er det ikke noe problem.)
userService.ts-fil:
I påloggingsmetoden har jeg følgende kode:
import jwt from "jsonwebtoken";
// I have defined userId
token = jwt.sign({ userId: userId, email: email }, secretKey, { expiresIn: expiresIn });
check-auth.ts-fil:
Også i check-auth mellomvare har jeg:
import jwt from "jsonwebtoken";
const decodedToken = jwt.verify(token, process.env.SECRET_KEY);
// Property 'userId' does not exist on type 'string | object'.
// Property 'userId' does not exist on type 'string'.ts(2339)
req.userData = { userId: decodedToken.userId }; // I need to access to the userId
Svar #1
Problemet er at jwt.verify ikke vet hva som kan være inne i den kodede token-strengen. Faktisk kan det være hva som helst signert med riktig nøkkel. Så du må gi TS et hint om forventet type. Som den raskeste løsningen:
type MyToken = {
userId: string
email: string
iat: number
exp: number
}
const decodedToken = jwt.verify(token, process.env.SECRET_KEY) as MyToken;
req.userData = { userId: decodedToken.userId }; // ok
Selv om jeg for produksjonskode ville brukt noe som en assert-funksjon for å verifisere innholdet i den dekodede tokenen:
type MyToken = {
userId: string
email: string
iat: number
exp: number
}
const decodedToken: unknown = jwt.verify(token, process.env.SECRET_KEY);
function verifyDecodedToken(data: unknown): asserts data is MyToken {
if (!(data instanceof Object))
throw new Error('Decoded token error. Token must be an object');
if (!('userId' in data))
throw new Error('Decoded token error. Missing required field "userId"');
// other necessary checks
}
verifyDecodedToken(decodedToken);
req.userData = { userId: decodedToken.userId }; // ok
lekeplasslenke
Svar #2
Erstatt
import jwt fra "jsonwebtoken";
med
import * as jwt from "jsonwebtoken";
// example,
import * as jwt from "jsonwebtoken";
let secretKey = "test";
let token = jwt.sign({ userId: "test", email: "[email " },secretKey,{ expiresIn: 300000 });
const decodedToken = jwt.verify(token, secretKey);
let result = { userId: decodedToken.userId }; // I need to access to the userId
console.log(result);
