勉強したことのメモ

webプログラマが勉強したことのメモ。

PHPでソーシャル(SNS)ログインする方法

   

「facebook / twitter / Googleアカウントでログインするシステムが欲しい」と言われた。PHPで最初からプログラムを組むのは大変そうなのでライブラリが無いか探したところOpauthというのが簡単にいけた。

 

今回の対応内容

facebook / twitter / Googleアカウントでログインし、ユニークなID及び登録名を取得する。サイト種別情報とユニークIDがあれば、後はセッションなりCookieでログインシステムは作られるので、今回はその取得部分をメモ。

 

Opauthの設置

以下ページよりダウンロードする。

http://opauth.org/download.php

「Opauth bundled with examples」と書かれているファイルが最初からfacebook / twitter / Google対応なのでオススメ。ダウンロードしたzipファイルを解凍し、任意のディレクトリにアップロードする。

今回はドメインを「http://hoge.com/test/opauth/」でディレクトリを「/var/www/html/test/opauth/」と仮定する。

「/var/www/html/test/opauth/」のディレクトリに、解凍したファイルを全てアップロードする。

 

設定ファイルの編集

opauth.conf.phpが設定ファイルになる。path及びStrategyの部分を書き換える。Strategyの取得方法は後述する。

 

facebookの設定

以下ページからアカウント作成もしくはログインする。

https://developers.facebook.com

アカウント作成には電話番号もしくはクレカ登録が必要なので注意。適当な名前のアプリを作成し、アプリID及びapp secretを取得する。尚、「設定→ページ下部のウェブサイトURL」を設定しておくこと。今回の場合だと「http://hoge.com/test/opauth/」を設定する。

opauth.conf.phpのStrategyのfacebook部分にapp_idとapp_secretを入力する。

 

twitterの設定

以下ページからアカウント作成もしくはログインする。

https://apps.twitter.com/

こちらは電話番号登録が必要になる。尚、電話番号がうまくいかない場合がある。その場合は以下のようにページをリロードすると正常に登録された。

http://absg.hatenablog.com/entry/2015/01/26/163057

Website、Callback URL共に「http://hoge.com/test/opauth/」と設定した。

opauth.conf.phpのStrategyのtwitter部分にkeyとsecretを入力する。

尚、このまま動かそうとすると「The Twitter REST API v1 is no longer active~~」という「APIのバージョンを1.0から1.1にして下さい」みたいなエラーが表示される。

「/opauth/lib/Opauth/Strategy/Twitter/TwitterStrategy.php」の以下部分を変更する。

#32行目付近の
'verify_credentials_json_url' => 'https://api.twitter.com/1/account/verify_credentials.json',
#を以下に変更する。
'verify_credentials_json_url' => 'https://api.twitter.com/1.1/account/verify_credentials.json',

 

Googleの設定

以下よりアカウント作成もしくはログインする。

https://console.developers.google.com/apis/library

認証情報→認証情報を作成→OAuthクライアントID→ウェブアプリケーションで作成する。まだリダイレクトURLに関しては詳しくは分からないんだけど「oauth2callback」をつける必要があるみたい。

今回は「http://hoge.com/test/opauth/google/oauth2callback」と設定した。

 

テストしてみる

「http://hoge.com/test/opauth/」のURLを開くとfacebook / Google / Twitterのリンクが表示され、そのリンクから遷移すると各サイトのログインページが表示される。

また正常にログインが完了すると「http://hoge.com/test/opauth/callback.php」にリダイレクトされ、取得したパラメータが表示される。

 

リダイレクト後の動きを変更する

opauth.conf.phpを以下の通り編集する。

#'callback_url' => '{path}callback.php',
'callback_url' => '{path}result.php',

 

以下を記述したファイルをresult.phpとしてアップロードする。

<?php
define('CONF_FILE', dirname(__FILE__).'/'.'opauth.conf.php');
define('OPAUTH_LIB_DIR', dirname(__FILE__).'/lib/Opauth/');

$flg = false;

do{

	if(!file_exists(CONF_FILE)){
		break;
	}

	require CONF_FILE;
	require OPAUTH_LIB_DIR.'Opauth.php';
	$Opauth = new Opauth( $config, false );

	$response = null;

	switch($Opauth->env['callback_transport']){	
		case 'session':
			session_start();
			$response = $_SESSION['opauth'];
			unset($_SESSION['opauth']);
			break;
		case 'post':
			$response = unserialize(base64_decode( $_POST['opauth'] ));
			break;
		case 'get':
			$response = unserialize(base64_decode( $_GET['opauth'] ));
			break;
		default:
			break;
	}

	if(array_key_exists('error', $response)){
		break;
	}else{
		if (empty($response['auth']) || empty($response['timestamp']) || empty($response['signature']) || empty($response['auth']['provider']) || empty($response['auth']['uid'])){
			break;
		} elseif (!$Opauth->validate(sha1(print_r($response['auth'], true)), $response['timestamp'], $response['signature'], $reason)){
			break;
		} else {
			$flg = true;
		}
	}

}while(0);


if( $flg ){
	$id = $response['auth']['uid'];
	$name = $response['auth']['info']['name'];

	echo 'login success [id]'.$id.'[name]'.$name;
}else{

	echo 'login error';
}

ログインが成功するとユニークID及び名前が表示される。

 

その他

あとはセッションなりCookieでログインシステムが作成できる。また名前はあっても無くてもいいかと。

 - PHP

  関連記事

PHPのcURLでnot found判別方法

cURLを使う際に、 if( curl_exec($ch) ){ //succe ...

Cannot re-assign auto-global variableのエラー

PHPバージョンアップに伴い「Fatal error: Cannot re-as ...

PHPのセッションでログイン、ログアウトの管理。あとセッションが保存されない場合の対処。

セッションはほとんど使ったことがなく、 色々つまづいたのでメモ。 やりたかった事 ...

画像をURLから取得して異なるサーバーにアップロード

■やりたかった事 ・画像があるサーバーはaaaサーバー ・アップロード先はbbb ...

PHPでcharset

header("Content-Type: text/html; charset ...

PHPでお問い合わせ等のform構築時にCSRF対策を行う方法

他社が制作されたお問い合わせフォームを改修する案件があった。ソースコードを拝見し ...

pdfからjpg/jpegへ出来るだけ劣化させずに変換

やりたかった事はpdfからjpg画像への変換。 imagemagick使えばすぐ ...

フォームデータを一気に取得

<? error_reporting(E_ALL & ~E_NOT ...

composerでmonologとTwigをインストール

「composerで○○をインストール」というのをよく見かけるがcomposer ...

javascriptとPHPで正規表現を使う場合

とりあえず使いそうなのは検索と置換。 ■javascript var str = ...