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

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

ただいまの
回答率

90.10%

【Laravel+Socialite】OAuthリクエストトークンが毎回同じになってしまう

解決済

回答 1

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 729

 困っていること

LaravelとSocialiteを使ってTwitterでログイン機能を実装しました。
キャッシュクリアしてページを読み込んで1回目にはTwitterのOAuthを経由してログインに成功するのですが、5分位してからログアウト→再度ログインしようとすると、
自分のアプリからTwitterの認証画面にリダイレクトするときにURLに付与される「oauth_token」パラメータの値が更新されず、

エラーが発生しました
このページのリクエスト・トークンが無効です。使用済み、または期限切れの可能性があります。 送信したサイトまたはアプリケーションに戻って再度お試しください。何らかの手違いがあったかもしれません。


とエラーになってしまいます。

https://api.twitter.com/oauth/authenticate?oauth_token=VPxAYwAAAAAA8EaMAAABZdi0cro


?oauth_token=以降のところが何度やっても同じ値になってしまう状態です。

ブラウザのキャッシュをクリアすると「oauth_token」パラメータの値が変わるため、何かしらブラウザに保存されている値を使用してしまっていると思うのですが、どこかの設定を変更する必要があるのか、わかりません。

わかる方、いらっしゃいませんか・・・

 Viewのソースコード(login.blade.php)

@extends('layouts.app')

@section('content')
<div class="container">
    <div class="row justify-content-center">
        <div class="col-md-8">
            <a role="button" href="auth/twitter">Login with Twitter</a>
        </div>
    </div>
</div>
@endsection

ルーティング(web.php)

<?php
Route::get('/', function(){
    return view('home');
  });

Route::get('auth/twitter', 'Auth\LoginController@redirectToProvider');
Route::get('auth/twitter/callback', 'Auth\LoginController@handleProviderCallback');
Auth::routes();

Auth\LoginController

<?php

namespace App\Http\Controllers\Auth;

use App\Http\Controllers\Controller;
use Illuminate\Foundation\Auth\AuthenticatesUsers;
use Illuminate\Http\Request;
use App\User;
use Socialite;
use Illuminate\Support\Facades\Auth;

class LoginController extends Controller
{

    /**
     * Twitterの認証ページヘユーザーをリダイレクト
     *
     * @return \Illuminate\Http\Response
     */
    public function redirectToProvider()
    {
        return Socialite::driver('twitter')->redirect();
    }

    /**
     * Twitterからユーザー情報を取得
     *
     * @return \Illuminate\Http\Response
     */
    public function handleProviderCallback()
    {
        $user = Socialite::driver('twitter')->user();

        // $user->token;
        $authUser = $this->findOrCreateUser($user);
        Auth::login($authUser, true);
        Auth::user()->update(['api_token' => str_random(60)]);
        return redirect('/');
    }

    private function findOrCreateUser($twitterUser){
        $authUser = User::where('twitter_id', $twitterUser->id)->first();
        if ($authUser){
            return $authUser;
        }
        return User::create([
            'name' => $twitterUser->name,
            'twitter_id' => $twitterUser->id
        ]);
    }

    use AuthenticatesUsers;

    /**
     * Where to redirect users after login.
     *
     * @var string
     */
    protected $redirectTo = '/';

    /**
     * Create a new controller instance.
     *
     * @return void
     */
    public function __construct()
    {
        $this->middleware('guest')->except('logout');
    }

    protected function authenticated(Request $request, $user)
    {
        $user->update(['api_token' => str_random(60)]);
    }

    public function logout(Request $request)
    {
        $user = $request->user();
        $user->update(['api_token' => null]);

        $this->guard()->logout();

        $request->session()->flush();
        $request->session()->regenerate();

        return redirect('/');
    }
}

.env

APP_NAME=MyApp
APP_ENV=testing
APP_KEY=******
APP_DEBUG=true
APP_URL=https://******/myapp

LOG_CHANNEL=stack

DB_CONNECTION=mysql
DB_HOST=******
DB_PORT=3306
DB_DATABASE=******
DB_USERNAME=******
DB_PASSWORD=******

BROADCAST_DRIVER=log
CACHE_DRIVER=file
SESSION_DRIVER=file
SESSION_LIFETIME=120
QUEUE_DRIVER=sync

PUSHER_APP_ID=
PUSHER_APP_KEY=
PUSHER_APP_SECRET=
PUSHER_APP_CLUSTER=mt1

MIX_PUSHER_APP_KEY="${PUSHER_APP_KEY}"
MIX_PUSHER_APP_CLUSTER="${PUSHER_APP_CLUSTER}"

TWITTER_CLIENT_ID=******
TWITTER_CLIENT_SECRET=******
CALLBACK_URL=https://******/myapp/auth/twitter/callback

 試したこと

PCのローカル上で、php artisan serveを使って動作させている際には発生しません。
レンタルサーバ上にデプロイした環境で発生します。

以下のブラウザで同じ事象が発生することを確認しました。

  • Google Chrome (MacOS)
  • Google Chrome (Android)
  • Firefox (MacOS)

 補足情報(FW/ツールのバージョンなど)

レンタルサーバーはロリポップ
PHP 7.1
Laravel 5.6
Socialite 3.1

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

check解決した方法

0

自己解決しました。

原因は、アプリケーションを設置しているディレクトリの上位のディレクトリに配置していた.htaccessの内容でした。

Header set Cache-Control "max-age=2628000, public"


この一文があったため、リンク先がキャッシュされていたようです。

アプリケーションのディレクトリにある.htaccessに

Header set Pragma no-cache
Header set Cache-Control no-cache


と記載することで解消しました。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

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

  • ただいまの回答率 90.10%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる