我在nestjs应用程序中使用passport-faceebook,并在其中有一个带有/callback路由的控制器。 在我做了一些身份验证之后,我调用重定向到客户端主页。 Google 策略在同一个选项卡中完成所有操作(Safari 和 Chrome)。但 Facebook 策略在身份验证后留下了两个选项卡。我希望只留下主页选项卡,不需要留下身份验证页面。 在 Chrome 中,facebook-strategy 按预期在一个选项卡中重定向。 此行为仅在 Safari 中出现。 所有浏览器均已更新至最新版本。
@Controller('auth')
export class AuthController {
constructor(
private authService: AuthService,
private cookiesService: CookiesService,
) { }
@Get('facebook')
@UseGuards(FacebookAuthGuard)
fbAuth() {}
@Get('facebook/callback')
@UseGuards(FacebookAuthGuard)
async fbAuthCallback(
@Req() req: Request,
@Res() res: Response,
@Query('state') state: string,
) {
const {
accessToken,
refreshToken,
} = await this.authService.authWithProvider(req.user as CreateUserDto);
this.cookiesService.setAccessTokenCookie(res, accessToken);
this.cookiesService.setRefreshTokenCookie(res, refreshToken);
const { origin } = JSON.parse(state);
res.redirect(`${process.env.CLIENT_URL}${origin || ''}`);
}
@UseGuards(GoogleAuthGuard)
@Get('google')
googleAuth() { }
@UseGuards(GoogleAuthGuard)
@Get('google/callback')
async googleAuthCallback(
@Req() req: Request,
@Res() res: Response,
@Query('state') state: string,
) {
const {
accessToken,
refreshToken,
} = await this.authService.authWithProvider(req.user as CreateUserDto);
this.cookiesService.setAccessTokenCookie(res, accessToken);
this.cookiesService.setRefreshTokenCookie(res, refreshToken);
const { origin } = JSON.parse(state);
res.redirect(`${process.env.CLIENT_URL}${origin || ''}`);
}
}
预计在使用 facebook-pasport 在 safari 中进行身份验证后会出现一个选项卡 尝试更改客户端请求(使用“next/navigation”中的 nextjs 路由器)
router.push(`${process.env.API_URL}/auth/facebook?origin=${encodeURIComponent(path || '')}`);
window.open(`${process.env.API_URL}/auth/facebook?origin=${encodeURIComponent(path || '')}`, '_self');
如果在 Safari 中固定选项卡,则会出现问题 可能是 Safari 错误