2009年10月
2009年10月30日
こんばんは、コレエダです。新しいページを作成しました。
お世話になっている方々、会社、私たちが制作にかかわったサイト、自社サービスとして展開しているサービスなど、まとめてリンクにしました。
興味があるかたは是非のぞいてください。
→こちらから
お世話になっている方々、会社、私たちが制作にかかわったサイト、自社サービスとして展開しているサービスなど、まとめてリンクにしました。
興味があるかたは是非のぞいてください。
→こちらから
2009年10月06日
こんにちは、コレエダです。たまには夕方に更新します。
今回はPHPでのセッションの破棄についてです。
前回お話した「おもいついったー」みたいなログインを作ったら、次はログアウトが作りたくなりました。
とはいっても、単純にセッション破棄してトップ画面に戻るだけです。
Twitter利用したアプリのログイン状態はセッションで管理しているので、そのセッション破棄すればログアウトでしょ?あれ、そうですよね?
ということで、以下セッション破棄のコードです。
<?php
session_start();
// セッション変数解除
$_SESSION = array();
// セッションクッキー削除
if (isset($_COOKIE[session_name()])) {
setcookie(session_name(), '', time()-42000, '/');
}
// セッション破棄
session_destroy();
//トップページにリダイレクト
header("Location: http://〜");
?>
ちなみにセッション破棄については「PHPでセッションを完全に破棄する方法」に非常にわかりやすくまとめてありました。
上記のソースコードもこの記事を参考にさせていただきました。
あ、ついでにひとつ。
セッションを使用する場所では「session_start()」関数を呼びます。
破棄をするときも例外ではありません。
session_start()関数を呼ばずにsession_destroy()を呼ぶとWarningが出ます。
@session_destroy()とするとWarningは消えますが、もちろん解決しているわけではありません。
今回はPHPでのセッションの破棄についてです。
前回お話した「おもいついったー」みたいなログインを作ったら、次はログアウトが作りたくなりました。
とはいっても、単純にセッション破棄してトップ画面に戻るだけです。
Twitter利用したアプリのログイン状態はセッションで管理しているので、そのセッション破棄すればログアウトでしょ?あれ、そうですよね?
ということで、以下セッション破棄のコードです。
<?php
session_start();
// セッション変数解除
$_SESSION = array();
// セッションクッキー削除
if (isset($_COOKIE[session_name()])) {
setcookie(session_name(), '', time()-42000, '/');
}
// セッション破棄
session_destroy();
//トップページにリダイレクト
header("Location: http://〜");
?>
ちなみにセッション破棄については「PHPでセッションを完全に破棄する方法」に非常にわかりやすくまとめてありました。
上記のソースコードもこの記事を参考にさせていただきました。
あ、ついでにひとつ。
セッションを使用する場所では「session_start()」関数を呼びます。
破棄をするときも例外ではありません。
session_start()関数を呼ばずにsession_destroy()を呼ぶとWarningが出ます。
@session_destroy()とするとWarningは消えますが、もちろん解決しているわけではありません。
2009年10月03日
こんばんは、コレエダです。みなさん、カヤックさんが運営されている「おもいついったー」というサービスをご存知でしょうか?
そこにログインボタンがあって、押下するとTwitterの認証へ行き、ログインするとまたトップページに戻ってきて、おもいついったーにログインしている状態になります。
なんだこれ?どうなってんの??と思ったのでやってみました。
まず、この仕組みはOAuth(オーオウス?)という認証システムを利用しています。Basic認証に替わるもので、あまり詳しく調べてないんですが、なんかよいみたいです(笑)
とりあえず、TwitterでOAuth認証を使用するための登録をします。
手順は「PHP+OAuthでTwitter」を見てください。
一部違うのは、最後に"Application Type"を"Client"に変更せずに、"Browser"のままにしておくところです。
そして「oauth_test.php」も書き換えて使用するので、削除しないでください。
ここまでオッケーですか?
では、最後に、私がちょっと手を加えた「oauth_test.php」を以下に。。。
<?php
// require twitterOAuth lib
require_once('twitterOAuth.php');
/* Sessions are used to keep track of tokens while user authenticates with twitter */
session_start();
/* Consumer key from twitter */
$consumer_key = 'あなたのconsumer_key';
/* Consumer Secret from twitter */
$consumer_secret = 'あなたのconsumer_secret';
/* Set up placeholder */
$content = NULL;
/* Set state if previous session */
$state = $_SESSION['oauth_state'];
/* Checks if oauth_token is set from returning from twitter */
$session_token = $_SESSION['oauth_request_token'];
/* Checks if oauth_token is set from returning from twitter */
$oauth_token = $_REQUEST['oauth_token'];
/* Set section var */
$section = $_REQUEST['section'];
/* Clear PHP sessions */
if ($_REQUEST['test'] === 'clear') {/*{{{*/
session_destroy();
session_start();
}/*}}}*/
/* If oauth_token is missing get it */
if ($_REQUEST['oauth_token'] != NULL && $_SESSION['oauth_state'] === 'start') {/*{{{*/
$_SESSION['oauth_state'] = $state = 'returned';
}/*}}}*/
/*
* Switch based on where in the process you are
*
* 'default': Get a request token from twitter for new user
* 'returned': The user has authorize the app on twitter
*/
switch ($state) {/*{{{*/
default:
/* Create TwitterOAuth object with app key/secret */
$to = new TwitterOAuth($consumer_key, $consumer_secret);
/* Request tokens from twitter */
$tok = $to->getRequestToken();
/* Save tokens for later */
$_SESSION['oauth_request_token'] = $token = $tok['oauth_token'];
$_SESSION['oauth_request_token_secret'] = $tok['oauth_token_secret'];
$_SESSION['oauth_state'] = "start";
/* Build the authorization URL */
$request_link = $to->getAuthorizeURL($token);
/* Build link that gets user to twitter to authorize the app */
header("Location: ".$request_link);
exit;
case 'returned':
/* If the access tokens are already set skip to the API call */
if ($_SESSION['oauth_access_token'] === NULL && $_SESSION['oauth_access_token_secret'] === NULL) {
/* Create TwitterOAuth object with app key/secret and token key/secret from default phase */
$to = new TwitterOAuth($consumer_key, $consumer_secret, $_SESSION['oauth_request_token'], $_SESSION['oauth_request_token_secret']);
/* Request access tokens from twitter */
$tok = $to->getAccessToken();
/* Save the access tokens. Normally these would be saved in a database for future use. */
$_SESSION['oauth_access_token'] = $tok['oauth_token'];
$_SESSION['oauth_access_token_secret'] = $tok['oauth_token_secret'];
}
header("Location: http://〜あなたのサイトのトップなど。ログイン後に表示させたいページ");
exit;
}/*}}}*/
?>
ログインボタンの飛び先が、この改造した「oauth_test.php」になるようにすればオッケーです。
あとは、セッションを見て、$_SESSION['oauth_access_token']と、$_SESSION['oauth_access_token_secret']があればログイン中にして、ログインボタン非表示とかにすればいいんじゃないかと思います。
また、セッションを使用するところでは全て<?php session_start(); ?>を忘れずに入れておきましょう。
そこにログインボタンがあって、押下するとTwitterの認証へ行き、ログインするとまたトップページに戻ってきて、おもいついったーにログインしている状態になります。
なんだこれ?どうなってんの??と思ったのでやってみました。
まず、この仕組みはOAuth(オーオウス?)という認証システムを利用しています。Basic認証に替わるもので、あまり詳しく調べてないんですが、なんかよいみたいです(笑)
とりあえず、TwitterでOAuth認証を使用するための登録をします。
手順は「PHP+OAuthでTwitter」を見てください。
一部違うのは、最後に"Application Type"を"Client"に変更せずに、"Browser"のままにしておくところです。
そして「oauth_test.php」も書き換えて使用するので、削除しないでください。
ここまでオッケーですか?
では、最後に、私がちょっと手を加えた「oauth_test.php」を以下に。。。
<?php
// require twitterOAuth lib
require_once('twitterOAuth.php');
/* Sessions are used to keep track of tokens while user authenticates with twitter */
session_start();
/* Consumer key from twitter */
$consumer_key = 'あなたのconsumer_key';
/* Consumer Secret from twitter */
$consumer_secret = 'あなたのconsumer_secret';
/* Set up placeholder */
$content = NULL;
/* Set state if previous session */
$state = $_SESSION['oauth_state'];
/* Checks if oauth_token is set from returning from twitter */
$session_token = $_SESSION['oauth_request_token'];
/* Checks if oauth_token is set from returning from twitter */
$oauth_token = $_REQUEST['oauth_token'];
/* Set section var */
$section = $_REQUEST['section'];
/* Clear PHP sessions */
if ($_REQUEST['test'] === 'clear') {/*{{{*/
session_destroy();
session_start();
}/*}}}*/
/* If oauth_token is missing get it */
if ($_REQUEST['oauth_token'] != NULL && $_SESSION['oauth_state'] === 'start') {/*{{{*/
$_SESSION['oauth_state'] = $state = 'returned';
}/*}}}*/
/*
* Switch based on where in the process you are
*
* 'default': Get a request token from twitter for new user
* 'returned': The user has authorize the app on twitter
*/
switch ($state) {/*{{{*/
default:
/* Create TwitterOAuth object with app key/secret */
$to = new TwitterOAuth($consumer_key, $consumer_secret);
/* Request tokens from twitter */
$tok = $to->getRequestToken();
/* Save tokens for later */
$_SESSION['oauth_request_token'] = $token = $tok['oauth_token'];
$_SESSION['oauth_request_token_secret'] = $tok['oauth_token_secret'];
$_SESSION['oauth_state'] = "start";
/* Build the authorization URL */
$request_link = $to->getAuthorizeURL($token);
/* Build link that gets user to twitter to authorize the app */
header("Location: ".$request_link);
exit;
case 'returned':
/* If the access tokens are already set skip to the API call */
if ($_SESSION['oauth_access_token'] === NULL && $_SESSION['oauth_access_token_secret'] === NULL) {
/* Create TwitterOAuth object with app key/secret and token key/secret from default phase */
$to = new TwitterOAuth($consumer_key, $consumer_secret, $_SESSION['oauth_request_token'], $_SESSION['oauth_request_token_secret']);
/* Request access tokens from twitter */
$tok = $to->getAccessToken();
/* Save the access tokens. Normally these would be saved in a database for future use. */
$_SESSION['oauth_access_token'] = $tok['oauth_token'];
$_SESSION['oauth_access_token_secret'] = $tok['oauth_token_secret'];
}
header("Location: http://〜あなたのサイトのトップなど。ログイン後に表示させたいページ");
exit;
}/*}}}*/
?>
ログインボタンの飛び先が、この改造した「oauth_test.php」になるようにすればオッケーです。
あとは、セッションを見て、$_SESSION['oauth_access_token']と、$_SESSION['oauth_access_token_secret']があればログイン中にして、ログインボタン非表示とかにすればいいんじゃないかと思います。
また、セッションを使用するところでは全て<?php session_start(); ?>を忘れずに入れておきましょう。
- ブログネタ:
- Webアプリケーション に参加中!