twitter ユーザでのログイン処理作成

twitter ユーザでのログイン処理作成

#11 ログイン処理を作ろう
http://dotinstall.com/lessons/tw_connect_php_v2/21911
を参考に
twitter ユーザでログインするための処理を実装

まず、$user の中身が入っているのを確認するので

if(!empty($user)){

で判定する

次に
セキュリティのためセッションハイジャック対策を行う

session_regenerate_id(true);

この意味は
セッションIDは新しいものと置き換わるが、セッション情報を維持される
というもの

ただしいくつか注意点もあるので
その参考リンクとしては

<a href="http://canalize.jp/archives/009281.php" title="http://canalize.jp/archives/009281.php" target="_blank">http://canalize.jp/archives/009281.php</a>

もみておいたほうがよいと思う
 
またログインセッションの me に$userの
情報をいれておくことで、ログインしているか判別する

ログインができたら、header() でホーム画面にとばす

header('Location: '.SITE_URL);

これで、再度 index.phpに戻り
ログインして twitter の認証後
ホーム画面が表示されれば成功

もし、

途中でうまくいかないときには
ソースと自分のファイルを
diff -w ソースファイル 自分のファイル

比較すると違いが表示されるのでわかりやすい

twitter ユーザ情報のDB格納とログイン処理

twitter ユーザ情報のDB格納とログイン処理

#10 ユーザー情報を格納してみよう (2)
http://dotinstall.com/lessons/tw_connect_php_v2/21910
を参考に
ユーザ情報のDB格納とログイン処理を実装

SQL文は前回作成しているので

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

prepare() のパラメータを
$params =array(
                        ":tw_user_id"=>$me->id_str,
                        ":tw_screen_name"=>$me->screen_name,
                        ":tw_access_token"=>$reply->oauth_token,
                        ":iw_access_token_secret"=>$reply->oauth_token_secret
                        );

で作成し

$stmt->execute($params);

で $stmt へデータを格納する

格納したデータをユーザの変数にいれるため

$myId = $dbh->lastInsertId();

で追加したIDを取得する

これでIDが判明するので
sqlでこのユーザの情報を取得

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

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

$user = $stmt->fetch();
とすることで、ユーザ情報取得している

twitter ユーザ情報をDB格納

twitter ユーザ情報をDB格納

3ヶ月前につまづいたところが
ようやく解決したので

#09 ユーザー情報を格納してみよう (1)
http://dotinstall.com/lessons/tw_connect_php_v2/21909
を参考に
認証したユーザの情報をDBに格納していく

注意点としては
twitter id は 64bit の整数のため
32bit OS では数値として正しく扱えないとのこと
このため twitter API では
id の文字列表現を
id_str に入れている

32bit OSなら $me->id_str だけど
64bit OSなら $me->id でもOKらしい

とりあえず、これに注意しながら行っていく

DB接続処理は、callback.php へ追記していく

DB接続は PDO形式で行い try catch で行う

try{

}catch(PDOException $e){
	echo $e->getMessage();
	exit;
}

echo $e->getMessage();

はエラーメッセージの表示

PDOでDB接続は

$dbh = PDO(DSN,DB_USER, DB_PASSWORD);

で行う

この大文字は config.php で設定した定数

次に、DBを参照し
すでに指定したユーザがいるなら、そのユーザを使い
存在しないのなら新規にDBへ格納する

まずは、存在の有無を確認

$sql ="select * from usrs where tw_user_id = :id limit 1";

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

で実行できる

もしユーザがいるなら

 $user = $stmt->fetch();

で$userに情報が格納される

もし、$user の中身が空なら、指定したユーザは存在しないのでDBへ追加していく

この判定をするには

if(!$user){

とすればOK

DBへ新しくデータを入れるには

$sql ="insert into users
                        (tw_user_id,tw_screen_name,tw_access_token,tw_access_token_secret,createdmodified) 
                        values( :tw_user_id,:tw_screen_name,:tw_access_token,:tw_access_token_secret,now(),now())";

というようにプレースホルダーを利用したSQLを使う

now() としているのは、現在時刻を使うから

twitter サービスでユーザ情報を表示

twitter サービスでユーザ情報を表示

以前実験した時にはここで挫折したので
再度チャレンジ

#08 ユーザー情報を表示してみよう
http://dotinstall.com/lessons/tw_connect_php_v2/21908
を参考に
認証後にユーザー情報を表示する

account_verifyCredentials() 

は codebirdで使える twitter へのアクセス方法

account_verifyCredentials() については
https://github.com/jublonet/codebird-php

3. Mapping API methods to Codebird function calls
の部分を参考にする

これが行っているのは
twitter API のほうでいろいろと情報取得するには
https://dev.twitter.com/docs/api/1.1
のリファレンスを参考にする

ここにはAPIで行える操作が載っている

今回取得したいのはユーザ情報なので
GET account/verify_credentials
のところになる

リファレンスは
https://dev.twitter.com/docs/api/1.1/get/account/verify_credentials
になる

GET account/verify_credentials
の / を _ にして
_ の後の文字を大文字にするというような
関数の記載ルールのようなものになっている

これで、アクセスしてもできなかったので
もう一度確認したところ
http://dotinstall.com/lessons/tw_connect_php_v2/21907
のまとめに

codebirdに付随するcacert.pemもcodebird.phpと同じディレクトリに置いてください。

とかかれていたので
FileZilla で cacert.pem を転送し
cp cacert.pem /var/www/html/tw_connect_php/
としたところ
無事に認証画面が開いた

これで twitter アカウントでログインすると
情報がでてくるので
一度右クリックしてページのソースを表示することで
見やすくなる
名前を確認するには
Ctrl + f で name と検索することで自分のユーザ名を調べやすくなる

これで、ユーザ情報の取得ができたことが確認できたので
var_dump($me); exit;
はコメントアウトして

以後DBへ結果の格納
ログイン処理
ホームへ飛ばす処理
これらを実装していく

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() のところがスペルミスしていた