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

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

新規登録して質問してみよう
ただいま回答率
85.50%
PHP

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

Facebook

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

Q&A

解決済

1回答

437閲覧

FacebookSDKを使った認証後、user_idを利用したい・オブジェクトの中身を取り出したい?

cosmo_tera

総合スコア11

PHP

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

Facebook

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

0グッド

0クリップ

投稿2017/10/04 01:25

編集2017/10/04 03:14

###前提・実現したいこと
PHPで、facebookのログイン機能を実現したい。
https://github.com/facebook/php-graph-sdk/blob/5.x/docs/examples/facebook_login.md
を参考にしています。

###詳細
たぶん認証は通っていて、下記のコードで

var_dump($tokenMetadata);

下記のように出力されます。

object(Facebook\Authentication\AccessTokenMetadata)#13 (1) { ["metadata":protected]=> array(8) { ["app_id"]=> string(15) "xxxxxxxxxxxxxxx" ["type"]=> string(4) "USER" ["application"]=> string(18) "XXXXXXXXXXXXXXXXXX" ["expires_at"]=> object(DateTime)#17 (3) { ["date"]=> string(26) "2017-12-03 09:14:00.000000" ["timezone_type"]=> int(3) ["timezone"]=> string(10) "Asia/Tokyo" } ["is_valid"]=> bool(true) ["issued_at"]=> object(DateTime)#18 (3) { ["date"]=> string(26) "2017-10-04 09:14:00.000000" ["timezone_type"]=> int(3) ["timezone"]=> string(10) "Asia/Tokyo" } ["scopes"]=> array(2) { [0]=> string(5) "email" [1]=> string(14) "public_profile" } ["user_id"]=> string(15) "xxxxxxxxxxxxxxxxxxxx" } }

この、["user_id"]部分を取り出したいのですが、どう記述してよいのかわかりません。

###試したこと
echo (string) $tokenMetadata["\0*\0user_id"];
→Cannot use object of type

###現在のコード

  • ログインリンク生成部
require_once("sdk/facebook/src/Facebook/Facebook.php"); require_once("sdk/facebook/src/Facebook/autoload.php"); $fb = new Facebook\Facebook([ 'app_id' => 'xxxxx', 'app_secret' => 'xxxxxx', 'default_graph_version' => 'v2.10', ]); $helper = $fb->getRedirectLoginHelper(); $permissions = ['email']; // Optional permissions $loginUrl = $helper->getLoginUrl('リダイレクトするコールバックURL', $permissions); ?> <a href="' . $loginUrl . '"><img src="xxx" /></a>
  • リダイレクトするコールバックURL
session_start(); require_once("src/Facebook/Facebook.php"); require_once("src/Facebook/autoload.php"); $fb = new Facebook\Facebook([ 'app_id' => 'xxxxx', 'app_secret' => 'xxxxxxx', 'default_graph_version' => 'v2.10', ]); $helper = $fb->getRedirectLoginHelper(); try { $accessToken = $helper->getAccessToken('コールバックURL'); } catch(Facebook\Exceptions\FacebookResponseException $e) { // When Graph returns an error echo 'Graph returned an error: ' . $e->getMessage(); exit; } catch(Facebook\Exceptions\FacebookSDKException $e) { // When validation fails or other local issues echo 'Facebook SDKa returned an error: ' . $e->getMessage(); exit; } if (! isset($accessToken)) { if ($helper->getError()) { header('HTTP/1.0 401 Unauthorized'); echo "Error: " . $helper->getError() . "\n"; echo "Error Code: " . $helper->getErrorCode() . "\n"; echo "Error Reason: " . $helper->getErrorReason() . "\n"; echo "Error Description: " . $helper->getErrorDescription() . "\n"; } else { header('HTTP/1.0 400 Bad Request'); echo 'Bad request'; } exit; } // Logged in echo '<h3>Access Token</h3>'; var_dump($accessToken->getValue()); // The OAuth 2.0 client handler helps us manage access tokens $oAuth2Client = $fb->getOAuth2Client(); // Get the access token metadata from /debug_token $tokenMetadata = $oAuth2Client->debugToken($accessToken); echo '<h3>Metadata</h3>'; var_dump($tokenMetadata); //ここまでサンプルどおり。 $tokenMetadata->metadata->user_id; (Cannot access protected property) echo $tokenMetadata["\0*\0metadata"]["user_id"]; (Cannot use object of type)

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

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

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

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

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

guest

回答1

0

ベストアンサー

オブジェクトだからこうかな(未検証なのでイメージだけ持ってもらえれば)

php

1$tokenMetadata->metadata->user_id 2 3metadata配下がarrayだからこっちかも↓ 4 5$tokenMetadata->metadata["user_id"]

投稿2017/10/04 01:28

編集2017/10/04 01:33
m.ts10806

総合スコア80765

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

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

cosmo_tera

2017/10/04 02:29

Cannot access protected property でエラーになっていまいます。 SDKの中身はよくわからないのですが、外から参照はできないのでしょうか?
m.ts10806

2017/10/04 02:33

あぁなるほど・・・。protected見逃してました。失礼。 現在組まれている認証部分のコード、$tokenMetadata取得部分のコードをあわせて質問本文に追記いただけますか? protectedでもアクセスの仕方がないわけではないです。
m.ts10806

2017/10/04 02:53 編集

そのままであっても、コードは質問本文に追記してください。 (array)キャスト使ったことでそのままではなくなっていますしね。 あと、キャスト使うなら、new時に使ったとしたら、 $tokenMetadata["\0*\0metadata"]["user_id"]になるかと思います。 protectedのものだけ \0*\0プロパティ名となるはずです。 念のためarrayキャストした変数をvar_dump()してからアクセス方法を検討してください。
cosmo_tera

2017/10/04 03:15

コード追加しました。 申し訳ありません。(array)キャストの意味がわかっていないようです。 何かをnewしないといけないのでしょうか?
m.ts10806

2017/10/04 03:21

説明不足すみません。newしなきゃいけないわけではなく、 「new時にキャストをしていたとしたら」という仮定での話でした。 $tokenMetadata取得時にキャストを入れればよいので、 $tokenMetadata = (array)$oAuth2Client->debugToken($accessToken); とした上で、 var_dump($tokenMetadata); としてみてください。object型がarrayとなってればあとは連想配列として利用できるようになっているはずです。
cosmo_tera

2017/10/04 04:20

できました!! 親切にご対応いただき、ありがとうございました。
m.ts10806

2017/10/04 04:26

解決したようで何よりです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問