実現したいこと
Twitter API v2を使ってログインユーザーがツイートを投稿できるようにしたいです。
前提
フロント:Next.js
バック :Next.js (API)
DB :MongoDB
アダプター:Prisma
認証 :Next-auth
投稿ライブラリ:twitter-api-v2
発生している問題・エラーメッセージ
ApiResponseError: Request failed with code 401が発生し、投稿できません。 セッションに正しくアクセストークンが入っていることは確認済みです。
該当のソースコード
import { TwitterApi } from "twitter-api-v2"; import type { NextApiRequest, NextApiResponse } from "next"; import { getServerSession } from "next-auth/next"; import { authOptions } from "./auth/[...nextauth]"; export default async (req: NextApiRequest, res: NextApiResponse) => { if (req.method !== "POST") { res.status(405).json({ error: "Method not allowed" }); return; } const session = await getServerSession(req, res, authOptions); if (!session) { res.status(401).json({ error: "Not authenticated" }); return; } if (!process.env.TWITTER_API_KEY || !process.env.TWITTER_API_SECRET_KEY) { throw new Error("Twitter keys are not set in environment variables."); } console.log("session.user:"); console.log(session.user.access_token); try { const client = new TwitterApi(session.user.access_token); // Post tweet const response = await client.v2.tweet("test"); console.log("response:"); console.log(response); res.status(200).json({ message: "Tweet posted successfully" }); } catch (error) { console.error(error); res.status(500).json({ error: "Error posting tweet", details: error }); } };
import NextAuth from "next-auth"; import TwitterProvider from "next-auth/providers/twitter"; import { PrismaAdapter } from "@next-auth/prisma-adapter"; import { PrismaClient } from "@prisma/client"; import { NextAuthOptions } from "next-auth"; const prisma = new PrismaClient(); const authOptions = { providers: [ TwitterProvider({ // clientId: process.env.TWITTER_API_KEY, // clientSecret: process.env.TWITTER_API_SECRET_KEY, // version: "1.0a", clientId: process.env.TWITTER_API_KEY, clientSecret: process.env.TWITTER_API_SECRET_KEY, version: "2.0", authorization: { params: { scope: "users.read tweet.write tweet.read offline.access" }, }, }), ], adapter: PrismaAdapter(prisma), callbacks: { async signIn(user) { console.log("---ここから---"); // console.log(user.account) // console.log(user.user); return true; }, async session({ session, user, token }) { const additionalData = await prisma.account.findUnique({ where: { userId: user.id }, }); console.log("additionalData:"); console.log(additionalData); session.user.id = user.id; session.user.themes = user.themes; session.user.access_token = additionalData.access_token; // session.user.access_token_secret = additionalData.access_token_secret; session.user.refresh_token = additionalData.refresh_token; return Promise.resolve(session); }, }, }; export default NextAuth(authOptions); export { authOptions };
試したこと
const client = new TwitterApi(session.user.access_token);
にAPI、API_SECRETを設定したりしてもダメでした。
補足情報(FW/ツールのバージョンなど)
ここにより詳細な情報を記載してください。

回答1件
あなたの回答
tips
プレビュー
下記のような回答は推奨されていません。
このような回答には修正を依頼しましょう。
また依頼した内容が修正された場合は、修正依頼を取り消すようにしましょう。