Passport-nestjs Github oauth: как отправить токены доступа из объекта запроса в URL-адресе обратного вызова в приложение на стороне клиента, размещенное в другом источнике?
Контроллер авторизации Nest js
// route to access github oauth
@Get('/')
@Public()
@UseGuards(AuthGuard('github'))
async githubAuth() {}
// callback url called after github strategy validates the user
@Get('/github/callback')
@Public()
@UseGuards(AuthGuard('github'))
async githubAuthRedirect(
@Req() req,
@Res({ passthrough: true }) res: Response,
) {
req.user.tokens = await this.authService.login(req.user);
const authData = JSON.stringify(
await this.authService.githubLogin({ ...req }),
);
// send this data to react app on a different origin
res.cookie('auth-data', authData);
res.redirect('http://localhost:3000');
}
Код реакции на стороне клиента
function Login({}: Props) {
const handleLoginWithGithub = () => {
window.open("http://127.0.0.1:5000/auth/", "_self");
};
return (
<div>
...
<button onClick={handleLoginWithGithub}>
Login With GitHub
</button>
...
</div>
)
Проблема
Маршрут авторизации, вызываемый на стороне клиента, вызывается с помощью функции window.open(), которая не позволяет устанавливать withCredentials, как в axios. Это приводит к установке заголовка Set-cookie, но файл cookie не устанавливается, поскольку сервер и клиент имеют разные источники.