Проверка подлинности паспорта Facebook, почему access_token, отправленный почтальоном, не дает мне правильный обратный вызов - PullRequest
0 голосов
/ 08 апреля 2020

Почему я отправил JSON файл с access_token в почтальоне для аутентификации через стратегию Facebook, но я понимаю, что моя стратегия не работает правильно, я 3 раза проверял оригинальную документацию, даже много учебников, я до сих пор не понимаю, почему мой код не достигает других log.info.

Существует 2 файла: AuthController.ts и facebookStrategy.ts. В соответствии с руководством я сделал это таким образом

Вот мой код

AuthController.ts

@injectable()
class AuthController implements Controller {
    @inject(Types.SERVICE)
    @named(Tags.REFRESH_TOKEN)
    public localAuthPath = '/auth/email';
    public facebookAuthPath = '/auth/facebookAuth';
    public googleAuthPath = '/auth/googleAuth';

    public router = Router();

    constructor() {
        this.initializeRoutes();
    }
    initializeRoutes(): void {
        //this.router.post(this.localAuthPath, this.localAuth);
        this.router.post(this.facebookAuthPath, this.facebookAuth);
        // this.router.post(this.googleAuthPath, this.googleAuth);
    }
    public getRouter(): Router {
        return this.router;
    }


    public async facebookAuth(req: Request, res: Response, next: NextFunction) {
        log.info('Here');
        try {
            log.info('Try segment!');
            passport.authenticate(
                'facebook',
                { session: false },
                async (err: Error, fClient: FacebookClient) => {
                    log.info('passport auth segment!');
                    try {
                        if (err) {
                            return next(err);
                        }
                        log.info(fClient);
                        if (!fClient) {
                            throw new ValidationError("Can't find user");
                        }

                        req.logIn(fClient, { session: false }, () => {
                            if (!fClient) {
                                return new ValidationError("Can't find user");
                            }
                        });
                    } catch (e) {
                        return next(e);
                    }
                })(req, res, next);
        } catch (error) {
            return next(error);
        }
    }
}

export default AuthController;

Вот facebookStrategy.ts

import passport from 'passport';
import strategy from 'passport-facebook';
import log from '../../utils/winston';
import UserType from '../../types/enums/ClientEnum';
import FacebookClientModel, { FacebookClient } from '../../models/client/FacebookClient';

const FacebookStrategy = strategy.Strategy;

passport.serializeUser<any, any>((user, cb) => {
    cb(undefined, user._id);
});

passport.deserializeUser((id, cb) => {
    FacebookClientModel.findById(id, (err, user) => {
        cb(err, user);
    });
});


const facebookAuth = async () => {
    log.info('const facebookAuth = ASyNC');
    passport.use(
        'facebook',
        new FacebookStrategy(
            {
                callbackURL: process.env.FACEBOOK_CALLBACK_URL,
                clientID: process.env.FACEBOOK_CLIENT_ID,
                clientSecret: process.env.FACEBOOK_APP_SECRET
            },
            async (accessToken, refreshToken, profile, callBack) => {
                try {
                    const fClient =  await FacebookClientModel.findOne(
                        { facebookId: profile.id } as FacebookClient,
                        (err, user) => {
                            return callBack(err, user);
                        }).exec();
                    log.info('const facebookAuth = ASyNC\n');
                    log.info(profile);
                    log.info(accessToken);
                    log.info(refreshToken);
                    log.info('\n', fClient);
                    if (fClient) {
                        callBack(null, fClient);
                    } else {
                        const newFacebookClient = new FacebookClient();
                        newFacebookClient.facebookId = profile.id;
                        newFacebookClient.token = accessToken;
                        newFacebookClient.email = profile.emails[0].value;
                        newFacebookClient.type = UserType.FACEBOOK;
                        await FacebookClientModel.create(newFacebookClient);
                    }
                    callBack(null, profile);
                } catch (e) {
                    callBack(e);
                }
            }
        )
    );
};

export default facebookAuth;

Это не входит даже в стратегию, но это должно быть. Он блокирует при первом вводе try catch в AuthController.ts и печатает Try segment!, пока я отправляю access_token почтальону, он просто показывает мне страницу с аутентификацией в ответе почтальона.

...