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

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

新規登録して質問してみよう
ただいま回答率
85.48%
OAuth 2.0

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

PHP

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

Google

Googleは、アメリカ合衆国に位置する、インターネット関連のサービスや製品を提供している企業です。検索エンジンからアプリケーションの提供まで、多岐にわたるサービスを提供しています。

Q&A

解決済

1回答

2520閲覧

PHPでGoogleのOAuth2.0、file_get_contets()が使えない

kmtym1998

総合スコア9

OAuth 2.0

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

PHP

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

Google

Googleは、アメリカ合衆国に位置する、インターネット関連のサービスや製品を提供している企業です。検索エンジンからアプリケーションの提供まで、多岐にわたるサービスを提供しています。

0グッド

1クリップ

投稿2020/01/31 14:19

編集2020/01/31 14:31

やりたいこと

PHPを使って認証を受けたユーザのGoogleアカウント情報を取得したい。
とりあえず、認証を受ける→基本プロフィール情報の出力 を目指している。

困っていること

以下のサイトを参考に、Googleアカウントを用いたユーザ認証の実装を試していました。

php

1//index.php 2<?php 3    // アプリケーション設定 4    define('CONSUMER_KEY', '<クライアントID>'); 5    define('CALLBACK_URL', '<リダイレクトURI>'); 6    // URL 7    define('AUTH_URL', 'https://accounts.google.com/o/oauth2/auth'); 8 9    $params = array( 10        'client_id' => CONSUMER_KEY, 11        'redirect_uri' => CALLBACK_URL, 12        'scope' => 'https://www.googleapis.com/auth/userinfo.profile email', 13        'response_type' => 'code', 14    ); 15    // 認証ページにリダイレクト 16    header("Location: " . AUTH_URL . '?' . http_build_query($params)); 17?> 18

リダイレクトURIに指定したページが以下のPHPファイルです。

php

1//display.php 2<?php 3// アプリケーション設定 4define('CONSUMER_KEY', '<クライアントID>'); 5define('CONSUMER_SECRET', '<クライアント シークレット>'); 6define('CALLBACK_URL', 'http://localhost/test/oauth.php'); 7// URL 8define('TOKEN_URL', 'https://accounts.google.com/o/oauth2/token'); 9define('INFO_URL', 'https://www.googleapis.com/oauth2/v1/userinfo'); 10$params = array( 11 'code' => $_GET['code'], 12 'grant_type' => 'authorization_code', 13 'redirect_uri' => CALLBACK_URL, 14 'client_id' => CONSUMER_KEY, 15 'client_secret' => CONSUMER_SECRET, 16); 17// POST送信 18$options = array('http' => array( 19 'method' => 'POST', 20 'content' => http_build_query($params) 21)); 22// アクセストークンの取得 23$res = file_get_contents(TOKEN_URL, false, stream_context_create($options)); 24// レスポンス取得 25$token = json_decode($res, true); 26if(isset($token['error'])){ 27 echo 'エラー発生'; 28 exit; 29} 30$access_token = $token['access_token']; 31$params = array('access_token' => $access_token); 32// ユーザー情報取得 33$res = file_get_contents(INFO_URL . '?' . http_build_query($params)); 34//表示 35echo $res; 36?>

エラー

Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in ~display.php on line 22 Warning: file_get_contents(https://accounts.google.com/o/oauth2/token): failed to open stream: no suitable wrapper could be found in ~display.php on line 22 Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in ~display.php on line 32 Warning: file_get_contents(https://www.googleapis.com/oauth2/v1/userinfo?): failed to open stream: no suitable wrapper could be found in ~display.php on line 32

index.phpにアクセスし、display.phpにリダイレクトした際にこちらのエラーが出力されます。
軽く調べてみたとろ、php.iniallow_url_includeに問題があるのかな?と思いましたが、自分が使用しているXFREEサーバでは、そこをいじることができません。

いろいろと調べてみましたが、いまいち原因がわからず手詰まってしまいました。

  • file_get_contents()が警告なしで使える方法は他にあるか
  • 以上で試している方法以外で、Googleアカウントのプロフィール情報を取得できる方法はあるか

こちらのいずれか、または両方についてご回答いただければ幸いです。

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

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

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

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

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

guest

回答1

0

ベストアンサー

XFREEでアカウント取って調査してみました。
file_get_contents()でローカルファイル以外はアクセス制限されていました。
curl系なら問題ありませんでしたのでこちらで出来ると思います。

XFREEでは.../public_html 配下以外はアクセスする手段がないのでphp.iniの編集も出来ませんでした :-(

XFREEではphpinfo()も使用できないですね。。。
echo ini_get("disable_functions"); で見てみると制限されてた。。。解除する手段もなさそうな感じ。

dl, backtick_operator, shell_exec, exec, system, passthru, popen, proc_open, pcntl_exec, phpinfo, fsockopen, pfsockopen, stream_socket_client---

ini_set('allow_url_fopen', 1); echo "#".ini_get('allow_url_fopen')."#";での出力も##となるので変更は無理そうですね。

curl系なら問題ありませんでした

php

1$curl = curl_init("https://google.jp/"); 2curl_setopt($curl, CURLOPT_CUSTOMREQUEST, 'GET'); 3curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, true); 4curl_setopt($curl, CURLOPT_RETURNTRANSFER, true); 5curl_setopt($curl, CURLOPT_FOLLOWLOCATION, true); 6echo curl_exec($curl); 7curl_close($curl);

  • file_get_contents()が警告なしで使える方法は他にあるか

軽く調べてみたとろ、php.iniのallow_url_includeに問題があるのかな?と思いましたが、自分が使用しているXFREEサーバでは、そこをいじることができません。

どこからallow_url_includeが出てきたのかわかりませんが、
エラーメッセージにはallow_url_fopen0になっているよ!って書いてあるので
allow_url_fopenの設定を変更しては?
(www.php.net)ini_set

(https://www.xserver.ne.jp/)php.ini設定で設定可能な項目

投稿2020/01/31 14:46

編集2020/02/01 20:47
Y.H.

総合スコア7914

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

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

kmtym1998

2020/01/31 15:34

ini_set('allow_url_fopen', 1); こちらを記述してみましたが、ダメでした。同じエラーが出ます。 file_get_contents()を使うのは無理がありそうですか。。?
Y.H.

2020/01/31 15:40

ini_set('allow_url_fopen', 1); file_get_contents(...); がダメならXFREEのサーバーに入っているPHPで何らかの方法でallow_url_fopen=0固定化されてるんでしょうね。file_get_contents()では無理そうです。 curl系が使えるかどうかですね。 https://www.php.net/manual/ja/book.curl.php なんとなく使えなさそうな感じはしますが。。。
退会済みユーザー

退会済みユーザー

2020/01/31 16:24

xfree の実態は xserver freeだよ。
退会済みユーザー

退会済みユーザー

2020/01/31 16:26

(※php.iniを直接編集される場合は、この限りではありません。) guiでいじれないだけ
Y.H.

2020/02/01 11:16

asahina1979 さん であれば回答通りallow_url_fopen Trueにできそうですけどね。。。 まぁあとは実際に使用されてる人に確かめてもらうしかないですね :-)
kmtym1998

2020/02/01 14:47

asahina1979さん >(※php.iniを直接編集される場合は、この限りではありません。) 確かにこのように書かれていますが、php.iniがどこにあるのやら、、、どうやって直接いじったらいいのかよくわかりませんでした。
kmtym1998

2020/02/01 14:48

Y.H.さん 少し試した感じだと、curlは使えそうだったのでこちらで頑張ってみようと思います。
Y.H.

2020/02/01 20:47 編集

回答変更しておきました。
Y.H.

2022/02/08 14:45

なんか回答がリニューアルによって壊れてしまってる。 https://teratail.com/questions/history-reply/347066 回答記入⇒回答修正⇒追記 のはずなのに 回答修正 分がすべて削除されたことにされた上で追記されたことになってる。 せっかくの試行錯誤の履歴なのに..(T^T)
Y.H.

2022/02/08 14:46

というか、この質問とは別の質問に付けた回答が表示されてる・・・
Y.H.

2022/02/09 01:13 編集

別の質問が表示されてるのではなく編集履歴が逆順に適用されている感じ。 回答についても同様。 リニューアルの際、データ移行で編集履歴逆順に適用したのか?
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問