質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Next.js

Next.jsは、Reactを用いたサーバサイドレンダリングなどを行う軽量なフレームワークです。Zeit社が開発しており、nextコマンドでプロジェクトを作成することにより、開発環境整備が整った環境が即時に作成できます。

OAuth 2.0

OAuth 2.0(Open Authorization 2.0)は、APIを通して保護されたリソース(サードパーティのアプリケーション)へアクセスする為のオープンプロトコルです。

Twitter

Twitterは、140文字以内の「ツイート」と呼ばれる短文を投稿できるサービスです。Twitter上のほぼ全ての機能に対応するAPIが存在し、その関連サービスが多く公開されています。

Q&A

解決済

1回答

680閲覧

Twitter API v2を使ってログインユーザーがツイートを投稿できるようにしたいです。

rinte

総合スコア2

Next.js

Next.jsは、Reactを用いたサーバサイドレンダリングなどを行う軽量なフレームワークです。Zeit社が開発しており、nextコマンドでプロジェクトを作成することにより、開発環境整備が整った環境が即時に作成できます。

OAuth 2.0

OAuth 2.0(Open Authorization 2.0)は、APIを通して保護されたリソース(サードパーティのアプリケーション)へアクセスする為のオープンプロトコルです。

Twitter

Twitterは、140文字以内の「ツイート」と呼ばれる短文を投稿できるサービスです。Twitter上のほぼ全ての機能に対応するAPIが存在し、その関連サービスが多く公開されています。

0グッド

0クリップ

投稿2023/05/12 10:53

実現したいこと

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/ツールのバージョンなど)

ここにより詳細な情報を記載してください。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

自己解決

accessTokenの期限が切れていることが原因でした。

投稿2023/05/12 11:24

rinte

総合スコア2

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問