У меня возникла ошибка на внешнем интерфейсе при попытке аутентификации с помощью Auth0
логина.Мой бэкэнд должен иметь возможность авторизовать пользователей с помощью социальных провайдеров (то есть Auth0
или Google
) и аутентифицировать их с помощью JSON Web Tokens
(JWTs
).
Я создал весь бэкэнд с помощьюpassportJS
и добавили Auth0
паспортную стратегию, а также стратегию Google.При тестировании конечных точек для обеих стратегий, он отлично работает с Postman
.
Но затем приходит интерфейсная часть, где я выполняю вызов API для localhost:3000/auth/auth0
, и возникает следующая ошибка:
Access to XMLHttpRequest at 'https://mydomain.auth0.com/authorize?response_type=code&redirect_uri=http%3A%2F%2Flocalhost%3A3000%2Fauth%2Fauth0%2Fcallback&scope=openid%20profile&state=7cQWAAvioTLCniVqAy4ghHXK&client_id=cDB1F0gO9QWyNqHh1TGuVl7It5nYQrs9' (redirected from 'http://localhost:3000/auth/auth0') from origin 'null' has been blocked by CORS policy: No 'Access-Control-Allow-Origin' header is present on the requested resource.
Код на внутренней стороне:
Файл main.ts
async function bootstrap() {
// Nest App
const app = await NestFactory.create(ApplicationModule, { cors: true });
// Body parser middleware with increase limits
app.use(bodyParser.urlencoded({limit: '5mb', extended: true}));
app.use(bodyParser.json({limit: '5mb'}));
app.enableCors();
app.use(session({
secret: 'secret',
resave: true,
saveUninitialized: true
}));
app.use(passport.initialize());
app.use(passport.session());
const port: number = +process.env.PORT || 3000;
await app.listen(port, () => {
// tslint:disable-next-line:no-console
console.log(`Nest app is listening on port ${port}.`);
});
}
bootstrap();
Файл auth0.strategy.ts
@Injectable()
export class Auth0Strategy extends PassportStrategy(Strategy, 'auth0')
{
constructor(private readonly authService: AuthService) {
super({
domain: config.auth0.domain,
clientID: config.auth0.clientID,
clientSecret: config.auth0.clientSecret,
callbackURL: 'http://localhost:3000/auth/auth0/callback',
passReqToCallback: true,
audience: config.auth0.audience,
scope: 'openid profile',
})
}
async validate(_request: any, _accessToken: string, _refreshToken: string, profile: any, done: Function) {
try {
const jwt: string = await this.authService.validateOAuthLogin(profile.id, Provider.AUTH0);
const user = { jwt };
done(null, user);
}
catch (err) {
done(err, false);
}
}
}
Файл auth.controller.ts
@Get('auth0')
@UseGuards(AuthGuard('auth0'))
auth0Login() {
// initiates the Auth0 OAuth2 login flow
}
@Get('auth0/callback')
@UseGuards(AuthGuard('auth0'))
async auth0Callback(@Req() req, @Res() res) {
const jwt: string = req.user.jwt;
if (jwt) {
res.redirect('http://localhost:4200/login/succes/' + jwt);
} else {
res.redirect('http://localhost:4200/login/failure');
}
}
Код на внешнем интерфейсе:
Файл authentication.service.ts
public login(): void {
this.apiService.get('auth/auth0').subscribe(
(res) => {
console.log('result', res);
}, (err) => {
console.log('error', err);
});
}
Я ожидаю, что откроется страница входа в систему Auth0
, поэтому пользователь долженбыть перенаправленным на эту страницу входа, но ничего не происходит из-за CORS policy: No 'Access-Control-Allow-Origin' header is present on the requested resource.