twitter サービスログイン画面作成

twitter サービスログイン画面作成

#06 ログイン画面を作ろう
http://dotinstall.com/lessons/tw_connect_php_v2/21906
を参考に
ログイン画面を作成

ログインの確認はセッションをつかう

session_start();

そして、判定は if で行うので

f(empty($_SESSION['me'])){

で me の中身が空なのか判定する

もし空なら header() でログイン画面にとばす

        header('Location: '.SITE_URL.'/login.php');
        exit;

として login.php に飛ばす

login.php のソースは

<!DOCTYPE html>
<html lang="ja">
<head>
        <meta charset="utf-8">
        <title>ログイン</title>
</head>
<body>
<h1>ログイン</h1>
<p><a href="callback.php">twitter でログイン</a></p>

</body>
</html>

として
callback.php でログイン処理を行うようにする

twitter サービスホーム画面作成

twitter サービスホーム画面作成

#05 ホーム画面を作ってみよう
http://dotinstall.com/lessons/tw_connect_php_v2/21905
を参考に、ログインしたあとのホーム画面を作成

index.php を作成し

require_once('config.php');
require_once('codebird.php');

で設定ファイルとライブラリを読み込む

HTML部分は

<!DOCTYPE html>
<html lang="ja">
<head>
        <meta charset="utf-8">
        <title>ホーム画面</title>
</head>
<body>
<h1>ホーム画面</h1>
<p>twitter アカウントでログインしています</p>
<p><a href="logout.php">[ログアウト]</a></p>


</body>
</html>

とする

つぶやき関連はリスト形式で表示するので

<ul>
<li></li>
</ul>

であとで表示していく

twitter login config.php

twitter login config.php

http://dotinstall.com/lessons/tw_connect_php_v2/21904

#04 アプリの設定をしよう
を参考に
設定ファイルを作成していく

まず、codebird.php を使うため
Filezilla で vagrant で作成した仮想マシンへ
SFTPで転送

再度 vagrant マシンに戻り

cp ~/codebird.php .
で転送したファイルを開発ディレクトリにコピー

vim config.php でファイルを作成し
設定を記述していく

define() を使って定数を定義していく

データソースネーム
ユーザ名
パスワードを設定するので

define('DSN','mysql:host=localhost;dbname=dotinstall_tw_connect_php');
define('DB_USER','dbuser');
define('DB_PASSWORD','1A38jsd');

そして twitter API へアクセスするための
コンシューマーキー
コンシューマーシークレットも
定数で設定しておく

define('COMSUMER_KEY','Consumer keyの値');
define('COMSUMER_SECRET','Consumer secretの値');

そして、サイトURLも定数にする

define('SITE_URL','http://dev.dotinstall.com/tw_connect_php/');

エラー出力の設定を
NOTICE以外すべて出力するため

error_reporting(E_ALL & -E_NOTICE);

セッションの設定のため

session_set_cookie_params(0,'/tw_connect_php/');
session_set_cookie_params();

については
http://php.net/manual/ja/function.session-set-cookie-params.php
を参考

引数については
0が有効期限

‘/tw_connect_php/’
がクッキーのドメイン

となる

twitter login

twitter login

http://dev.dotinstall.com/tw_connect_php/
で行い

HTML
PHP
CSS
MySQLを使う

cordebird.php
を使うため
https://github.com/mynetx/codebird-php
からダウンロード

アプリ登録が必要なので
https://dev.twitter.com/
へアクセスし、アプリを登録

登録方法は
http://dotinstall.com/lessons/tw_connect_php_v2/21902
の動画を参照

アプリ作成時に名前に twitter とはいっているとダメなので
name に
DTlogintest
これは、他の人ともかぶらないアプリ名にするため

description つまりアプリの概要に
twitterlogin

website には開発環境のURL
http://dev.dotinstall.com

callback url には
http://dev.dotinstall.com/tw_connect_php/callback.php
として実際の callback.php はあとで作成する

これで作成完了すると
アプリの詳細画面になる

この中で使うのは
Consumer key

Consumer secret
の値

ここまでできたら、今回は vagrant で作成した仮想マシンをつかっていく

仮想マシンを作成したディレクトリに移動して
vagrant up

vagrant ssh
でログインして

cd /var/www/html/
で移動

mkdir tw_connect_php
でディレクトリ作成して

cd tw_connect_php/
で移動

以下、ここで作成していく

まず、DBを作成していく

mysql -u root -p でログインして

crate database dotinstall_tw_connect_php;
でDB作成

grant all on dotinstall_tw_connect_php.* to dbuser@localhost identified by’1A38jsd’;
で権限をもったユーザを作成

use dotinstall_tw_connnect_php;
で使用するDBを指定

create table users(
id int not null auto_increment primary key,
tw_user_id varchar(30) unique,
tw_screen_name varchar(15),
tw_access_token varchar(255),
tw_access_token_secret varchar(255),
created datetime,
modified datetime
);

まず、連番の主キーを作成するので
id int not null auto_increment primary key

twitter のユーザID、名前を格納するため
tw_user_id varchar(30) unique,
tw_user_name varchar(15),

twitter の access token と acccess_secret を格納したいので
tw_access_token varchar(255),
tw_access_token_secret varchar(255),

あとは作成と変更の時間を格納するため
created datetime,
modified datetime
とする

これらsqlをそのまま実行してもできるけど
今後、別の環境でも作成したいのなら
twitter.sql というように sql ファイルを作成し
sqlを書いて

mysql -u root -p < twitter.sql として mysql root のパスワードを入れれば DBを作成できる

google web サービスログアウト処理実装

google web サービスログアウト処理実装

#16 ログアウト処理を実装しよう
http://dotinstall.com/lessons/google_connect_php_v2/9916
を参考に、ログアウト処理を実装していく

編集するのは
index.php

まず、ログアウトするためのリンクを作成

<p><a href="logout.php">ログアウト</a></p>

そして、 vim logout.php
でファイルを作成し内容を書いていく

まず、設定ファイル関連を読み込む

require_once('config.php');
require_once('functions.php');

session_start();

セッションの内容を空にしたいので

$_SESSION = array();

とする

cookie も削除するので

if(isset($_COOKIE[session_name()])){

}

で cookie があるか判定し
あるなら削除する処理をしていく

cookie 削除処理は

setcookie(session_name(),'',time()-86400,'/google_connect_php/');

time()-86400 とすることで
範囲は1日前にしておく

次に、サーバー側のセッション情報を
破棄したいので

session_destroy();

ここまでできたら、index.php に戻りたいので

header('Location: '.SITE_URL);

とする

これで、google アカウントをつかってログイン
ログアウトする仕組みができる

全体の復習には
http://dotinstall.com/lessons/google_connect_php_v2
を参照

google web サービスログイン処理実装

google web サービスログイン処理実装

#15 ログイン処理を実装しよう
http://dotinstall.com/lessons/google_connect_php_v2/9915
を参考に
ログイン画面を実装して、ホーム画面にユーザ情報を表示

編集するファイルは redirect.php

まずは、ログイン処理
if(!empty($user)){
}
という判定で $user の中身が空でないか判定する
その後、セッションハイジャック対策をおこなうため
session_regerate_id()
を使って

session_regenerate_id(true);

とする

この session_regenerate_id() については
http://php.net/manual/ja/function.session-regenerate-id.php
のリファレンスを参考にする
この関数をつかうと
現在のセッションIDを新しく生成したものと置き換えることができる
ちなみに、現在のセッション情報は遺児されたまま

肝心のログイン処理だけど
これは
meという変数へ $user の値を入れればOK

$_SESSION['me'] = $user;

ここまでできたら
header() でホーム画面に飛ばす

header('Location: '.SITE_URL);

ここまでできたら、次に index.php を編集していく

body 要素のところへ

<p>
<?php echo h($_SESSION['me']['google_name']); ?>
(<?php echo h($_SESSION['me']['google_email']); ?>) のGoogleアカウントでログインしています</p>

と追記する

ここまでできたら、再び index.php へブラウザでアクセスして
google 認証すると
ログイン画面にて
アカウントの名前やメールアドレスが表示される

途中、ログイン画面でなにもでなくてこまったけど
vim index.php_base
でコピペして
自分のファイル
index.php と

diff -w index.php index.php_base
で違いを表示したら
h() のところがスペルミスしていた

google web サービスで」格納した情報の抽出

google web サービスで」格納した情報の抽出

#14 ユーザー情報を格納しよう (2)
http://dotinstall.com/lessons/google_connect_php_v2/9914
を参考に
DBへ格納したデータを抽出する

DBへ格納したデータを
$user へ入れていく

まず、レコードのIDを知りたいので

$myId = $dbh->lastInsertId();

で取得する

lastInsertId() については
http://php.net/manual/ja/pdo.lastinsertid.php
のリファレンスを参考にする

このlastInsertId() は
最後に挿入された行のID、あるいはシーケンスの値を取得する

これを使って $myId へその値を格納している

そして sql を実行していく

$sql = "select * from  users where id = :id limit 1";
$stmt = $dbh->prepare($sql);

$stmt->execute(array(":id"=>$myId));
$user = $stmt->fetch();

これで、格納できているか確認するため
var_dump() で中身をみてみる

var_dump($user);exit;

確認してみたら、
アクセストークンが違っていて
$me->access_token
ではなく
$json->access_token
だった

DBに追加した情報を削除したいので

mysql -u root -p
でログインして

delete from users;

でDBの内容を削除

再度、index.php から認証してDBに追加

追加できたら

select * from users;

でDBの中身を確認して
アクセストークンも含まれているなら成功

google web サービスで取得した情報をDB格納

google web サービスで取得した情報をDB格納

#13 ユーザー情報を格納しよう (1)
http://dotinstall.com/lessons/google_connect_php_v2/9913
を参考に
取得したユーザ情報をDBへ格納


$sql "insert into users(
	google_user_id, 
	google_email,
	google_name,
	google_picture,
	google_access_token,
	created,
	modified)
 values(

	:google_user_id, 
	:google_email,
	:google_name,
	:google_picture,
	:google_access_token,
	now(),
	now())";

とする

:google_user_id というように
: がついているのは
prepare() を使うから

この変数に格納された SQL を実行するので

$stmt=$dbh->prepare($sql);

パラメータを指定するので

$params = array(
	":google_user_id"=>$me->id. 
	":google_email"=>$me->email,
	":google_name"=$me->name,
	":google_picture"=>$me->picture,
	":google_access_token"=>$me->access_token);

これでパラメータがセットできたので実行

$stmt->execute($params);

google web サービスでユーザ情報の取得

google web サービスでユーザ情報の取得

#12 ユーザー情報を取得しよう
http://dotinstall.com/lessons/google_connect_php_v2/9912
を参考に
アクセストークンをつかってユーザ情報を取得

これについては
https://developers.google.com/accounts/docs/OAuth2WebServer?hl=ja#callinganapi

Calling a Google API
の部分を参考にする

これによれば
GETで
https://www.googleapis.com/oauth2/v1/userinfo?access_token=
にアクセスすることになる

このURL後ろにアクセストークンをつける

$url = 'https://www.googleapis.com/oauth2/v1/userinfo?access_token='.$json->access_token;

でURLを $url へ格納する

$json に access_token の項目が格納されているので

$json->access_token

としている

このようなAPIの引っ張り方は、他のweb api
で使うので
覚えておくと便利

これにアクセスして情報を得たいので

file_get_contents($url)

としている

file_get_contents() は
ファイルの内容をすべて文字列に読み込む関数
http://php.net/manual/ja/function.file-get-contents.php
のリファレンスを参考にするとわかりやすい

今回は $url で データを読み込むファイルを指定している
リファレンスだと filename に該当する部分

しかし、返ってくる値は json なので
json_decode() をつかってデコードする必要がある

json_decode() については
http://php.net/manual/ja/function.json-decode.php
のリファレンスを参考にする

今回は

json_decode(file_get_contents($url));

となる

このJSONデコードされたユーザ情報を変数に格納するので

$me = json_decode(file_get_contents($url));

とする

中身を確認したいので
var_dump() を使って確認

var_dump($me);

ただし、セッションの関係もあり、そのままリロードするとうまくいかないため
一度 index.php に戻って
再度 google の認証してから試すようにする

そのままだと見にくいので
右クリックして
ページのソースを表示とすれば
改行されてみやすくなる

情報取得が確認できたら
var_dump()
はコメントアウトして

DBへ情報を格納していく

$dbh = connectDb();

次に、SQLでユーザの存在を調べ
いないのならDBへ追加する

$sql ="select * from users where google_user_id = id limit 1";

このSQLを実行するため

$stmt = $dbh=>prepare($sql);
$stmt=>execute(array(":id"=>$me->id));
$user = $stmt=>fetch();

if でユーザの存在がなかったときにDB追加する判定は

if(!$user){
}

となる

google web サービスでアクセストークンの取得その2

google web サービスでアクセストークンの取得その2

#11 アクセストークンを取得しよう (2)
http://dotinstall.com/lessons/google_connect_php_v2/9911
を参考に
アクセストークン取得を実装

前回、パラメータを設定したので
curl を使うところから開始

curl_setopt($curl, CURLOPT_URL,$url);
これは決まり文句らしいけど
意味を検索

http://php.net/manual/ja/function.curl-setopt.php

curl_setopt() のリファレンスがあるので、これを参照

curl_setopt() は
curl 転送用オプションを指定する関数

引数の解説をメモすると

$curl
は、curl_init() がかえす curl ハンドル

CURLOPT_URL
は、取得するURLとなる
ttp
このほかにもいくつかオプションを設定する

curl_setopt($curl, CURLOPT_POST,1);
curl_setopt($curl, CURLOPT_POSTFIELDS, http_build_query($params));
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);

これらのオプションの解説メモ

curl_setopt($curl, CURLOPT_POST,1);
CURLOPT_POST

は、POSTを行う
POST は、
application/x-www-form-urlencoded 形式
なので、一般的なHTMLフォームとおなじ

curl_setopt($curl, CURLOPT_POSTFIELDS, http_build_query($params));
CURLOPT_POSTFIELDS

は、POSTで送信するすべてのデータを指定する

http_build_query() 

は、URLエンコードされたクエリ文字列を作成する関数
web api でよくある & で結合したURLをつくる
関数については
http://php.net/manual/ja/function.http-build-query.php
のリファレンスを参照

http_build_query($params)

なので $params で client_id などを設定したので
これらをパラメータとして
リクエストURLが作成される

curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);

CURLOPT_RETURNTRANSFER


true を設定すると
curl_exec() の返り値を文字列でかえす
通常だとデータを直接出力する

これらのオプション設定ができたら

$rs = curl_exec($curl);

で実行する

curl_exec() については
http://php.のnet/manual/ja/function.curl-exec.php
のリファレンスを参照

この関数は、指定した curl セッションを実行する

curl の実行が終わったら

curl_close($curl);

で閉じるのを忘れずに

curl_close() は
curl セッションを閉じる
http://php.net/manual/ja/function.curl-close.php
のリファレンスも参考にする

返ってきた値の $rs は
JSON形式なので

$json = json_decode($rs);

でJSON文字をデコードして
PHPの変数に変換する

json_decode() は
http://php.net/manual/ja/function.json-decode.php
のリファレンスを参考にするとわかりやすい

この
$json
には、アクセストークンが入っているので
それを確認するため、一度
var_dump() を使って
画面に表示する

var_dump($json); exit;

そのまま再度ブラウザをリロードしても
セッション関連でエラーになる ため
一度 index.phpからアクセスしなおす

これで、ブラウザで
アクセストークンが表示されていれば成功