🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Node.js

Node.jsとはGoogleのV8 JavaScriptエンジンを使用しているサーバーサイドのイベント駆動型プログラムです。

OAuth

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

Twitter

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

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

ログイン

ログインは、ユーザーがコンピューターシステムにアクセスするプロセスの事を呼びます。

Q&A

解決済

1回答

1731閲覧

passportでtwitterログインができない (Failed to find request token in session)

Konta0111

総合スコア13

Node.js

Node.jsとはGoogleのV8 JavaScriptエンジンを使用しているサーバーサイドのイベント駆動型プログラムです。

OAuth

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

Twitter

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

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

ログイン

ログインは、ユーザーがコンピューターシステムにアクセスするプロセスの事を呼びます。

1グッド

1クリップ

投稿2019/12/14 11:22

passportでtwitterAPIの認証を行おうとしていますがうまくいきません。
callback URLまでは到達しているようですが、下記のエラーが発生します

Error: Failed to find request token in session

at SessionStore.get (.../node_modules/passport-oauth1/lib/requesttoken/session.js:13:44)

以下コードに差し替えてコールバックURLのreq.sessionのconsole出力すると、確かに認証トークンに関する情報が入っていませんでした。

javascript

1app.get("/callback", (req, res) => { 2 console.log(req.session); 3 res.send("hello"); 4});

以下が動作させているコードです。
何か不足している記述がありますでしょうか?

Twitter Developer ConsoleのコールバックURLは何度も確認しており、正しく設定されています。
http://127.0.0.1:3000で動作させています

【index.js】

javascript

1const express = require("express"); 2const next = require("next"); 3const http = require("http"); 4const session = require("express-session"); 5const port = parseInt(process.env.PORT, 10) || 3000; 6const dev = process.env.NODE_ENV !== "production"; 7const nextApp = next({ dev }); 8const handle = nextApp.getRequestHandler(); 9 10const auth = require('./modules/twitterPassport'); 11const passport = auth.passport; 12const Const = require('./const'); 13 14nextApp.prepare().then(() => { 15 const app = express(); 16 17 app.use( 18 session({ 19 secret: 'some secret', 20 resave: true, 21 saveUninitialized: true, 22 cookie: { 23 secure: 'true', 24 }, 25 }), 26 ); 27 //認証のセッションを保存 28 app.use(passport.initialize()); 29 app.use(passport.session()); 30 31 app.get("/login", passport.authenticate('twitter')); 32 app.get("/callback", passport.authenticate('twitter', 33 { 34 successRedirect: '/success', 35 failureRedirect: '/failure', 36 }) 37 ); 38 39 app.get("*", (req, res) => { 40 return handle(req, res); 41 }); 42 43 44 const server = http.createServer(app); 45 server.listen(port, err => { 46 if (err) throw err; 47 console.log(`>Server is running`); 48 }); 49}); 50

【modules/twitterPassport.js】

javascript

1const passport = require('passport'); 2const TwitterStrategy = require('passport-twitter'); 3const Const = require('../const'); 4 5const twitterConsumerKey = process.env.CONSUMER_KEY; 6const twitterSecretKey = process.env.CONSUMER_SECRET; 7const callbackURL = `${Const.BASE_URL}${Const.API_CALLBACK_SLUG}`; 8 9passport.serializeUser(function(user, done) { 10 done(null, user.id); 11}); 12passport.deserializeUser(function(obj, done) { 13 done(null, obj); 14}); 15 16passport.use(new TwitterStrategy({ 17 consumerKey: twitterConsumerKey, 18 consumerSecret: twitterSecretKey, 19 callbackURL: callbackURL, 20 }, 21 function(token, tokenSecret, profile, done) { 22 passport.session.id = profile.id; 23 24 // tokenとtoken_secretをセット 25 profile.twitter_token = token; 26 profile.twitter_token_secret = tokenSecret; 27 28 done(null, profile); 29 30)); 31 32module.exports = { passport: passport }; 33
DrqYuto👍を押しています

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

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

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

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

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

guest

回答1

0

自己解決

自己解決しました

express-sessionの設定値
saveUninitializedをfalseにすることで正しく認証されました

投稿2019/12/17 15:36

Konta0111

総合スコア13

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問