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

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

0回答

364閲覧

Nextauthを使ってTwitterのアクセストークンをリフレッシュトークンによって再取得したい。

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/14 13:34

実現したいこと

Nextauthを使ってtwitte API v2のOauth2.0で認証したアクセストークンをリフレッシュトークンによって再取得したい。

前提

Twitterアカウントによる認証システムを作っています。

発生している問題・エラーメッセージ

認証ヘッダーの値が誤っているというエラーが返されます。

Error refreshing access token { error: 'invalid_request', error_description: 'Value passed for the token was invalid.' }

該当のソースコード

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: "2.0", authorization: { params: { scope: "users.read tweet.write tweet.read offline.access" }, }, }), ], adapter: PrismaAdapter(prisma), callbacks: { async signIn(user, account, profile) { const { access_token, refresh_token, expires_at } = user.account; console.log("ログイン"); // await prisma.account.update({ // data: { // access_token: access_token, // expires_at: expires_at, // refresh_token: refresh_token, // }, // where: { userId: user.user.id }, // }); return true; }, async session({ session, user, token }) { // console.log(session); // console.log(user); // console.log(token); const additionalData = await prisma.account.findUnique({ where: { userId: user.id }, }); if (additionalData.expires_at * 1000 > Date.now()) { // console.log(additionalData.expires_at * 1000); // console.log(Date.now()); } if (additionalData.expires_at * 1000 < Date.now()) { const clientId = process.env.TWITTER_API_KEY; const clientSecret = process.env.TWITTER_API_SECRET_KEY; try { const response = await fetch( "https://api.twitter.com/2/oauth2/token", { method: "POST", headers: { "Content-Type": "application/x-www-form-urlencoded", Authorization: "Basic " + Buffer.from(clientId + ":" + clientSecret).toString("base64"), }, body: new URLSearchParams({ refresh_token: additionalData.refresh_token, grant_type: "refresh_token", client_id: process.env.TWITTER_API_KEY, // client_secret: process.env.TWITTER_API_SECRET_KEY, }), } ); const tokens = await response.json(); if (!response.ok) throw tokens; // await prisma.account.update({ // data: { // access_token: tokens.access_token, // expires_at: Math.floor(Date.now() / 1000 + tokens.expires_in), // refresh_token: // tokens.refresh_token ?? additionalData.refresh_token, // }, // where: { userId: user.id }, // }); } catch (error) { console.error("Error refreshing access token", error); session.error = "RefreshAccessTokenError"; } } session.user.id = user.id; session.user.themes = user.themes; session.user.role = user.role; session.user.tweetContent = user.tweetContent; session.user.tweetStyle = user.tweetStyle; session.user.access_token = additionalData.access_token; return Promise.resolve(session); }, }, }; export default NextAuth(authOptions); export { authOptions };

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

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

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

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

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

guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問