1

私はパスポート不和とパスポートを使用して、ユーザーが不和アカウントを使用して認証できるようにしています。

何らかの理由で、Cookie がブラウザー (フロントエンド Web サイト) に保存されていません。axios (リクエスト オプションで withCredentials を true に設定) を使用して、リクエストから認証済みユーザーを取得する Express サーバーにリクエストを送信します (req.ユーザー)、セッションはデータベース (mongodb atlas) に保存されますが、Cookie はブラウザーに保存されません。これはローカルで機能しますが、vercel のようなプラットフォームで Web サイトをホストしている場合は機能しません。Cookie は API ページに保存されていますが、フロントエンド Web サイトには保存されていません。これは非常に奇妙です。

API のメイン ファイル:

const app = require('express')();
const routes = require('./src/routes'); // all the routes
const passport = require('passport');
const mongoose = require('mongoose');
const session = require('express-session');
const cors = require('cors');
const MongoStore = require('connect-mongo');

require('./src/strategies/discord'); // this is where the users are serialized, deserialized
mongoose.connect('database uri');

app.use(
    cors({
        origin: [
            'api url',
            'frontend website url',
        ],
        credentials: true,
    })
);
app.use(
    session({
        secret: 'session secret',
        cookie: {
            maxAge: 30000,
        },
        resave: false,
        saveUninitialized: false,
        store: MongoStore.create({
            mongoUrl: 'database uri',
        }),
    })
);
app.use(passport.initialize());
app.use(passport.session());
app.use('/api', routes);

app.listen(3000, () => {
    console.log(`[API] Running on Port 3000`);
});

/strategies/discord.js ファイル (ユーザーがシリアライズおよびデシリアライズされる場所:

const passport = require('passport');
const DiscordStrategy = require('passport-discord');
const model = require('../models/User');

passport.serializeUser((user, done) => {
    console.log(`Serialized: ${user._id}`);
    done(null, user._id);
});

passport.deserializeUser(async (id, done) => {
  console.log(`Deserialized: ${id}`)
    try {
        const user = await model.findById(id);
        return user ? done(null, user) : done(null, null);
    } catch (err) {
        console.log(err);
        done(err, null);
    }
});

passport.use(
    new DiscordStrategy(
        {
            clientID: 'the client id',
            clientSecret: 'the app client secret',
            callbackURL: `https://apiurl/discord/redirect`,
            scope: ['identify', 'guilds'],
        },
        async (accessToken, refreshToken, profile, done) => {
            const { id, username, discriminator, avatar, guilds } = profile;
            try {
                const found = await model.findByIdAndUpdate(
                    id,
                    {
                        discordTag: `${username}#${discriminator}`,
                        avatar,
                        guilds,
                    },
                    {
                        new: true,
                    }
                );

                if (found) {
                    console.log(`User was found`);
                    return done(null, found);
                } else {
                    const newUser = await new model({
                        _id: id,
                        discordTag: `${username}#${discriminator}`,
                        avatar,
                        guilds,
                    }).save();
                    return done(null, newUser);
                }
            } catch (err) {
                console.log(err);
                return done(err, null);
            }
        }
    )
);

auth.js ファイル (ユーザーが Oauth2 ページにリダイレクトされる場所):

const router = require('express').Router();
const passport = require('passport');

router.get('/discord', passport.authenticate('discord'));
router.get(
    '/discord/redirect',
    passport.authenticate('discord'),
    (req, res) => {
        res.redirect(`http://localhost:3001/guilds`);
    }
);

router.get('/', (req, res) => {
    if (req.user) {
        res.send(req.user);
    } else {
        return res.status(401).send('Unauthorized'); // I make a request to this url with axios from my frontend website (withCredentials set to true, so the cookies can be sent)
    }
});

module.exports = router;

auth.js ファイルでわかるように、ユーザーがログインすると、フロントエンド Web サイトのギルド ページにリダイレクトされます。discord.js の相互ギルドを取得するために、API に再度リクエストを行います。クライアントとユーザー。ユーザーがログインしているかどうか (req.user が存在するかどうか) を確認し、ログインしている場合は、相互ギルドまたは単に 401 応答を送信し、ユーザーをホームページにリダイレクトします。

Web サイトにログインすると、ギルド ページにリダイレクトされ、すぐにホームページにリダイレクトされます。コンソールを確認すると、(API から) 401 応答があります。Web サイトの [アプリケーション] タブを確認すると、Cookie はありませんが、API ページには Cookie があります。

これが私のコードの問題なのか、それとも私が使用しているパッケージの問題なのかはわかりません。助けていただければ幸いです。

4

0 に答える 0