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

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

ただいまの
回答率

90.75%

  • PHP

    19178questions

    PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

  • Facebook

    390questions

    Facebookは、実名登録制のSNS(ソーシャル・ネットワーキング・サービス)です。開発者用のデベロッパーサイトが存在し、一般ユーザーによるFacebook向けアプリケーション開発が可能です。

  • ログイン

    110questions

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

既にFacebookログイン中か確認したい

解決済

回答 1

投稿 編集

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

manaeos

score 2

Facebook SDKを使用してのFacebookログインはできたのですが、
一度ブラウザを閉じてからサイトアクセスすると
ログアウト状態になり、再度ログインボタンを押さなければなりません。
その時はパスワードの入力は省けているのですが、
ログインボタンを押さずにアクセスしたページで
ログイン認証済みかを確認するにはどうすればいいでしょうか。
いろいろ調べてみてJavascriptで「userID」を取得する方法は分かったのですが、
PHPで同じようにする方法が分からず困ってます。

参考にしたのは以下のサイトです。
http://c-geru.com/as_blind_side/2017/04/facebookapiphp.html
このページ内の図解にあり「member.php」に直接アクセスして、
既にFacebookログイン中であれば、そのままサイトにログイン状態になるようにしたいのです。

どうかよろしくお願いします。

<補足>
ただ、この仕様がセキュリティー上良くないことなのか分かりません。
その点でも助言等頂けると助かります。

<追記 2018/4/24>
ご返信ありがとうございます。

質問だけで詳細を記載していなかったので、追記します。
サイトには独自の会員登録があります。(PHP + MysQL)
それとは別にFacebookログインを追加で実装したいんです。

現在は、SDKを使用して上記の状態です。
初めてFacebookログインしたときは、フォームに移動し、
会員登録に必要な項目を入力して登録完了になります。
その後は、facebookログインボタンを押すと、ログイン状態になります。

ただ「食べログ」のように、すでにFacebookにログインした状態であれば、
サイトにアクセスした時にサイト内でログインした状態に自動で切り替わるようにしたいのです。

一応Javascriptでのやり方は、どこでか忘れてしまったのですが、
以下の内容で「UserID」の取得は出来ました。

  // This is called with the results from from FB.getLoginStatus().
  function statusChangeCallback(response) {
    console.log('statusChangeCallback');
    console.log(response);
    // The response object is returned with a status field that lets the
    // app know the current login status of the person.
    // Full docs on the response object can be found in the documentation
    // for FB.getLoginStatus().
    if (response.status === 'connected') {
      // Logged into your app and Facebook.
      testAPI();

    FB.getLoginStatus(function(responsezz) {
        console.log(responsezz);
        if (response.status === 'connected') {
            // FBにログインしてて,このユーザはアプリ認証もとってる.
            //ユーザーIDを取得accessToken
            alert(responsezz.authResponse.userID);
            var fbUid = responsezz.authResponse.userID;
        } else if (response.status === 'not_authorized') {
            // FBにログインはしてるけど,このアプリの認証はない.
        } else {
            // FBにログインしてない
        }
    });        

    } else {
      // The person is not logged into your app or we are unable to tell.
      document.getElementById('status').innerHTML = 'Please log ' +
        'into this app.';
    }
  }

  // This function is called when someone finishes with the Login
  // Button.  See the onlogin handler attached to it in the sample
  // code below.
  function checkLoginState() {
    FB.getLoginStatus(function(response) {
      statusChangeCallback(response);
    });
  }

  window.fbAsyncInit = function() {
    FB.init({
      appId      : '●●●●●●●●●●●●●●●●●●',
      cookie     : true,  // enable cookies to allow the server to access 
                          // the session
      xfbml      : true,  // parse social plugins on this page
      version    : 'v2.12' // use graph api version 2.8
    });

    // Now that we've initialized the JavaScript SDK, we call 
    // FB.getLoginStatus().  This function gets the state of the
    // person visiting this page and can return one of three states to
    // the callback you provide.  They can be:
    //
    // 1. Logged into your app ('connected')
    // 2. Logged into Facebook, but not your app ('not_authorized')
    // 3. Not logged into Facebook and can't tell if they are logged into
    //    your app or not.
    //
    // These three cases are handled in the callback function.

    FB.getLoginStatus(function(response) {
      statusChangeCallback(response);
    });

  };

  // Load the SDK asynchronously
  (function(d, s, id) {
    var js, fjs = d.getElementsByTagName(s)[0];
    if (d.getElementById(id)) return;
    js = d.createElement(s); js.id = id;
    js.src = "https://connect.facebook.net/en_US/sdk.js";
    fjs.parentNode.insertBefore(js, fjs);
  }(document, 'script', 'facebook-jssdk'));

  // Here we run a very simple test of the Graph API after login is
  // successful.  See statusChangeCallback() for when this call is made.
  function testAPI() {
    console.log('Welcome!  Fetching your information.... ');
    FB.api('/me', function(response) {
      console.log('Successful login for: ' + response.name);
      document.getElementById('status').innerHTML =
        'Thanks for logging in, ' + response.name + '!';
    });
  }

</script>


これで気になったのが、「appId」がそのままソースに出ているのですが、
これはセキュリティー上問題ないのでしょうか?
(他のサイトでも見かけたので、気にしすぎかもしれませんが・・・・)

あと、Javascriptで「UserID」を取得して、この内容をPHPに移して会員認証をしたいのですが、
自分がJavascriptをまだよくわかっていないので、
「$.ajax」やJSONを使うのは分かっても、そこからデータを飛ばすのが、
どうしても出来ません。

質問内容がズレてきているかもしれませんが、
最初に「PHPで同じようにする方法が分からず困ってます」と書きましたが、
それは前述の理由と、自分がPHPならまだ分かるという理由です。
JavaScript SDKでも構いません。

長文になり申し訳ありませんが、
何卒よろしくお願いします。

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

質問への追記・修正、ベストアンサー選択の依頼

  • asahina1979

    2018/04/22 18:19

    それどうみても OAUTH ログインを試して FB側の動きを示してるだけに見えますが

    キャンセル

  • Lulucom

    2018/04/23 12:05

    「Javascriptで「userID」を取得する方法」<- 現在JSでFB.getLoginStatus()をお使いということでしょうか。(もしそうでしたら質問に追記願います)

    キャンセル

回答 1

checkベストアンサー

+1

実際に試したわけではないのですが、
JavaScript SDKからアクセストークンを取得する例
が参考になるかもしれません。

この例では、JavaScript SDK で FB.login を使っていますが、替わりに FB.getLoginStatus() を使えば良い気がしています。PHP 側は同様の実装になるかなと思います。

(追記)
既に FB.getLoginStatus() をお使いのようですので、以下のようにリダイレクトすれば良いかと思います。

if (response.status === 'connected') {
    // FBにログインしてて,このユーザはアプリ認証もとってる.
    // アクセストークンを取得するPHPスクリプトに利用者をリダイレクト
    window.location.href = '/js-login.php';
}

PHP側では前述のFacebookドキュメントの例にある js-login.php のようにアクセストークンを処理すれば良いと思います。

(追記2)
そのアクセストークンを使ってグラフAPIを使ったユーザープロフィールの取得によりユーザーのIDを取得できます。

(追記3)
あるいはアクセストークンからアクセストークンメタデータを取得すればユーザーのIDを取得できそうです。

投稿

編集

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2018/04/24 21:43

    ありがとうございます。
    今いろいろ抱えていて、直ぐに確認できないのですが、
    どこかで時間をとって(GW中になりそうですが・・・)試してみます。
    結果はご報告します。

    キャンセル

  • 2018/05/08 22:22

    お世話になります。
    遅くなってすみません。
    何とかできました。

    window.location.href = '/js-login.php';
    でリダイレクトして、ユーザーIDを取得。
    そして元のページへリダイレクト
    (リダイレクトした際、JavaScript SDKでループしないようにしてます)

    ただこれが正しいのかどうか分からないのですが・・・。
    一応理想通りのことはできました。
    ありがとうございました。

    キャンセル

  • 2018/05/09 09:11

    ありがとうございます。サーバーサイドでユーザーIDを取得したら、それをもとにユーザー固有のページを表示できるのではないかと思いました。ユーザー固有のページにそのJavaScript SDKの処理があるのでしたら、確かにループしないよう制御する必要がありそうですね。

    キャンセル

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

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

関連した質問

同じタグがついた質問を見る

  • PHP

    19178questions

    PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

  • Facebook

    390questions

    Facebookは、実名登録制のSNS(ソーシャル・ネットワーキング・サービス)です。開発者用のデベロッパーサイトが存在し、一般ユーザーによるFacebook向けアプリケーション開発が可能です。

  • ログイン

    110questions

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