Получить информацию о пользователе Auth0 в NestJS - PullRequest
0 голосов
/ 06 декабря 2018

Я пытаюсь выполнить авторизацию Auth0 в NestJS, но я не уверен, как получить данные пользователя в обработчике URL-адреса обратного вызова.

При использовании функции обычного экспресса это можно решить с помощью приведенного ниже кода.Я вызываю функцию passport.authenticate ('auth0', function (err, user, info) {}) с функцией обратного вызова и получаю в ней дату пользователя.

// Perform the final stage of authentication and redirect to previously requested URL or '/user'
router.get('/callback', function (req, res, next) {
  passport.authenticate('auth0', function (err, user, info) {
    if (err) { return next(err); }
    if (!user) { return res.redirect('/login'); }
    req.logIn(user, function (err) {
      if (err) { return next(err); }
      const returnTo = req.session.returnTo;
      delete req.session.returnTo;
      res.redirect(returnTo || '/user');
    });
  })(req, res, next);
});

Но я не уверен, как это должно бытьсделано в стиле NestJS.С декораторами и охранниками.В NestJS я добавляю следующую функцию.Но как мне получить данные пользователя в нем?

  @Get('cb')
  async callback(): Promise<any> {
    // WHAT SHOULD I CALL HERE?
  }

auth.controller.ts

@Controller('auth')
export class AuthController {
  constructor(
    private readonly authService: AuthService,
  ) {}

  @Get('login')
  @UseGuards(AuthGuard('auth0'))
  async login(): Promise<any> {
    const v = this.configService.get('TEST');
    return { r: 'ok1', v };
  }

  @Get('cb')
  // @UseGuards(AuthGuard('auth0'))
  async callback(): Promise<any> {
    // WHAT SHOULD I CALL HERE?
  }

}

auth0.strategy.ts

@Injectable()
export class Auth0Strategy extends PassportStrategy(Strategy) {
  constructor(
    private readonly authService: AuthService,
    private readonly configService: ConfigService,
  ) {
    super({
      domain: 'zzzz',
      clientID: 'zzzz',
      clientSecret: 'zzzz',
      callbackURL: '/auth/cb',
    });
  }

  async validate(payload) {
    console.log('Auth0Strategy payload', payload);
    return payload;
  }
}

1 Ответ

0 голосов
/ 10 декабря 2018

Кажется, что на github есть пример , как вы можете использовать Nest.js с Auth0.

Если вы посмотрите на данный пример, вы обнаружите, что вам нужно сделать следующие вещи:

Определение пустой конечной точки обратного вызова в AuthController:

@Get('/callback')
public callback() {}

Определение промежуточного программного обеспечения

@Injectable()
class Auth0CallbackMiddleware implements NestMiddleware {
  resolve() {
    return authenticate('auth0', {
      successRedirect: '/user',
      failureRedirect: '/'
    }, (req, res) => {
        if (!req.user) {
            throw new Error('user null');
        }
        res.redirect("/");
    }
    );
  }
}

Использование этого промежуточного программного обеспечения:

@Module({
  providers: [Auth0Strategy, Auth0LoginMiddleware, Auth0CallbackMiddleware],
  controllers: [AppController]
})
export class ApplicationModule implements NestModule {
  configure(consumer: MiddlewareConsumer) {
    consumer


.apply(Auth0LoginMiddleware)
  .forRoutes({path: '/login', method: RequestMethod.ALL})

  .apply(Auth0CallbackMiddleware)
  .forRoutes({path: '/callback', method: RequestMethod.ALL})

  .apply(EnsureLoggedIn)
  .forRoutes({path: '/user', method: RequestMethod.ALL});

  }
}

Проверка подтвержденияфункция внутри Auth0Strategy.В примере это выглядит немного иначе:

async (accessToken, refreshToken, extraParams, profile, done) => {
        return done(null, profile);
}
...