Я пытаюсь настроить очень простую систему входа в систему, используя jwt-passport с nestjs.Я следовал этому уроку: https://docs.nestjs.com/techniques/authentication, но я просто не могу заставить его работать.Я действительно новичок в этом деле и буду признателен, если кто-нибудь покажет мне путь.
Способ отправки логина на сервер:
this.clientAuthService.login(this.userName, this.password).then(response => {
this.clientAuthService.setToken(response.access_token);
this.router.navigate(['/backend']);
});
Мой ClientAuthService:
export class ClientAuthService {
constructor(private http: HttpClient, @Inject(PLATFORM_ID) private platformId) {
}
getToken(): string {
if (isPlatformBrowser(this.platformId)) {
return localStorage.getItem(TOKEN_NAME);
} else {
return '';
}
}
setToken(token: string): void {
if (isPlatformBrowser(this.platformId)) {
localStorage.setItem(TOKEN_NAME, token);
}
}
removeToken() {
if (isPlatformBrowser(this.platformId)) {
localStorage.removeItem(TOKEN_NAME);
}
}
getTokenExpirationDate(token: string): Date {
const decoded = jwt_decode(token);
if (decoded.exp === undefined) {
return null;
}
const date = new Date(0);
date.setUTCSeconds(decoded.exp);
return date;
}
isTokenExpired(token?: string): boolean {
if (!token) {
token = this.getToken();
}
if (!token) {
return true;
}
const date = this.getTokenExpirationDate(token);
if (date === undefined) {
return false;
}
return !(date.valueOf() > new Date().valueOf());
}
login(userName: string, password: string): Promise<any> {
const loginData = {username: userName, password};
return this.http
.post(Constants.hdaApiUrl + 'user/login', loginData, {headers: new HttpHeaders({'Content-Type': 'application/json'})})
.toPromise();
}
}
Мой user.controller.ts
@Controller('user')
export class UserController {
constructor(private readonly authService: AuthService) {
}
@UseGuards(AuthGuard('local'))
@Post('login')
authenticate(@Request() req) {
return this.authService.login(req);
}
}
Мой user.service.ts
export class UsersService {
private readonly users: User[];
constructor() {
this.users = [
{
userId: 1,
username: 'test',
password: '12345',
}
];
}
async findOne(username: string): Promise<User | undefined> {
return this.users.find(user => user.username === username);
}
}
Тогда у меня есть jwt.strategy.ts
export class JwtStrategy extends PassportStrategy(Strategy) {
constructor() {
super({
jwtFromRequest: ExtractJwt.fromAuthHeaderAsBearerToken(),
ignoreExpiration: false,
secretOrKey: Constants.jwtSecret,
});
}
async validate(payload: any) {
return { userId: payload.sub, username: payload.username };
}
}
и local.strategy.ts
export class LocalStrategy extends PassportStrategy(Strategy) {
constructor(private readonly authService: AuthService) {
super();
}
async validate(username: string, password: string): Promise<any> {
const user = await this.authService.validateUser(username, password);
if (!user) {
throw new UnauthorizedException();
}
return user;
}
}
В основном я просто следовал учебному пособию и сам добавил кое-что для клиентской части.Я пропустил часть с UseGuard('local')
для маршрута входа в систему, но после добавления я получаю ошибку 401 всегда.Когда я не использую UseGuard('local')
, не имеет значения, что я печатаю в форме входа.После того, как я отправляю детали, я получаю доступ к бэкэнду, даже если он не был корректным.
Также стоит упомянуть, что методы validate в jwt.strategy.ts и local.strategy.tsпомечен как not used
в WebStorm.
Я знаю, что здесь много кода, но мне нужна помощь, потому что я не могу найти другие источники для конфигурации аутентификации NestJS, которая актуальна.Такое ощущение, что учебник, которому я следовал, пропустил много шагов для начинающих.