Почему я отправил 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
почтальону, он просто показывает мне страницу с аутентификацией в ответе почтальона.