Ошибка при аутентификации с социальным провайдером из серверной части - PullRequest
0 голосов
/ 07 февраля 2019

У меня возникла ошибка на внешнем интерфейсе при попытке аутентификации с помощью 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.

...