node.js - πώς να εισάγω το επίπεδο υπηρεσιών μου στο Auth Guard; NestJS - AuthGuards
Δημιουργώ ένα σύστημα αυθεντικοποίησης μέσω UseGuards, αλλά πώς μπορώ να εισάγω εξαρτήσεις στα guards μου; Θα ήθελα να το κάνω με παγκόσμιο τρόπο, για να αποφύγω την επανάληψη κώδικα και το να εισάγει κάθε controller τις εξαρτήσεις.
Χρησιμοποιώ τη μέθοδο της αντιστροφής εξαρτήσεων και εισάγω τις κλάσεις, επίσης καθιστώ τις κλάσεις να εξαρτώνται μόνο από υλοποιήσεις και κανόνες διεπαφών...
Οι Υπηρεσίες Πιστοποίησής Μου
export class AuthServices implements IMiddlewareAuth {
constructor(
private readonly jwt: IJWTDecrypt,
private readonly authUserRepo: IAuthUserContract,
) {}
public async intercept(
req: IMiddlewareAuth.Attrs,
): Promise<IMiddlewareAuth.Return> {
const token = req.headers['Authorization'];
if (!token) {
new Fails('Access denied', 403);
}
const parts = token.split(' ');
if (parts.length !== 2) {
return new Fails('Anauthorized', 401);
}
const [scheme, access] = parts;
if (!/^Bearer$/i.test(scheme)) {
return new Fails('Anauthorized', 400);
}
const id = await this.jwt.decrypt(access);
if (!id) {
return new Fails('Anauthorized', 400);
}
const user = await this.authUserRepo.findById(id);
if (!user) {
return new Fails('Anauthorized', 400);
}
return user;
}
}
οι Φύλακες Ελέγχου Ταυτότητας μου
@Injectable()
export class AuthorizationGuard implements CanActivate {
constructor(
@Inject('AuthServices')
private authServices: IMiddlewareAuth,
) {}
public async canActivate(context: ExecutionContext): Promise<boolean> {
const request = context.switchToHttp().getRequest();
const user = await this.authServices.intercept(request);
if (user instanceof Fails) {
throw new HttpException(
{
statusCode: user.statusCode,
error: user.message,
},
user.statusCode,
);
}
request.user = {
email: user.email,
id: user.id,
name: user.name,
} as ISessionLogin;
return true;
}
}
το Auth.Module μου
@Module({
imports: [ConfigModule.forRoot(), TypeOrmModule.forFeature([UserEntity])],
providers: [
{
provide: AuthUserRepository,
useFactory: (dataSource: DataSource) => {
return new AuthUserRepository(
dataSource.getMongoRepository(UserEntity),
);
},
inject: [getDataSourceToken()],
},
{
provide: JsonWebToken,
useFactory: () => {
return new JsonWebToken();
},
},
{
provide: AuthServices,
useFactory: (
jwt: JsonWebToken,
authUserRepository: AuthUserRepository,
) => {
return new AuthServices(jwt, authUserRepository);
},
inject: [JsonWebToken, AuthUserRepository],
},
],
exports: [AuthServices],
})
export class AuthModule {}
Σφάλμα
Απάντηση #1
Χρησιμοποιήστε @Inject(AuthService) αντί για @Inject('AuthService'). Η σημαντική διάκριση είναι ότι 'AuthService' είναι ένα string token που ταιριάζει με το AuthService.name και το AuthService είναι μια αναφορά σε κλάση. Επίσης, βεβαιωθείτε ότι το CreateUsersModule έχει το AuthModule στον πίνακα imports.
