Skip to content

Instantly share code, notes, and snippets.

@nissuk
Created February 8, 2011 15:33
Show Gist options
  • Save nissuk/816590 to your computer and use it in GitHub Desktop.
Save nissuk/816590 to your computer and use it in GitHub Desktop.
PEAR::HTTP_OAuthとLimonadeではてなOAuth認証を行う例
<?php
// http://developer.hatena.ne.jp/ja/documents/auth/apis/oauth/consumer#sample-ruby
require_once 'lib/limonade.php';
require_once 'HTTP/OAuth/Consumer.php';
session_start();
function before(){
$consumer_key = 'YOUR_CONSUMER_KEY';
$consumer_secret = 'YOUR_CONSUMER_SECRET';
$consumer = new HTTP_OAuth_Consumer($consumer_key, $consumer_secret);
$http_request = new HTTP_Request2();
$http_request->setConfig('ssl_verify_peer', false);
$consumer_request = new HTTP_OAuth_Consumer_Request();
$consumer_request->accept($http_request);
$consumer->accept($consumer_request);
$GLOBALS['consumer'] = $consumer;
};
dispatch('/', function(){
return render_('index');
});
// リクエストトークン取得から認証用URLにリダイレクトするためのアクション
dispatch('/oauth', function(){
global $consumer;
// リクエストトークンの取得
$consumer->getRequestToken(
'https://www.hatena.com/oauth/initiate',
'http://localhost' . option('base_uri') . 'u=oauth_callback',
array('scope' => 'read_public,write_public'));
// セッションへリクエストトークンを保存しておく
$_SESSION['request_token'] = $consumer->getToken();
$_SESSION['request_token_secret'] = $consumer->getTokenSecret();
// 認証用URLにリダイレクトする
redirect_to($consumer->getAuthorizeUrl('https://www.hatena.ne.jp/oauth/authorize'));
});
// 認証からコールバックされ、アクセストークンを取得するためのアクション
dispatch('/oauth_callback', function(){
global $consumer;
$consumer->setToken($_SESSION['request_token']);
$consumer->setTokenSecret($_SESSION['request_token_secret']);
// リクエストトークンとverifierを用いてアクセストークンを取得
$consumer->getAccessToken('https://www.hatena.com/oauth/token', $_GET['oauth_verifier']);
// アクセストークンをセッションに記録しておく
$_SESSION['access_token'] = $consumer->getToken();
$_SESSION['access_token_secret'] = $consumer->getTokenSecret();
unset($_SESSION['request_token'], $_SESSION['request_token_secret']);
return render_('oauth_callback');
});
// アクセストークンを利用して、OAuthに対応したAPIを利用するためのアクション
dispatch('/hello', function(){
global $consumer;
$consumer->setToken($_SESSION['access_token']);
$consumer->setTokenSecret($_SESSION['access_token_secret']);
// access_tokenなどを使ってAPIにアクセスする
$response = $consumer->sendRequest('http://n.hatena.com/applications/my.json', array(), 'GET');
if ($body = $response->getBody()) {
$data = json_decode($body, true);
} else {
$data = array();
}
return render_('hello', compact('data'));
});
function render_($name, $locals=array()){ return render('tpl_' . $name, '', $locals); }
run();
'__END__';
function tpl_index($vars)
{ extract($vars) ?>
<p><a href="<?php echo url_for('/oauth') ?>">Hatena</a></p>
<?php if ($_SESSION['access_token'] && $_SESSION['access_token_secret']): ?>
<a href="<?php echo url_for('/hello') ?>">hello oauth api.</a>
<?php endif ?>
<?php }
function tpl_oauth_callback($vars)
{ extract($vars) ?>
<p>success getting access_token.</p>
<p>your access token is below.</p>
<dl>
<dt>access_token</dt>
<dd><?php echo $_SESSION['access_token'] ?></dd>
<dt>access_token_secret</dt>
<dd><?php echo $_SESSION['access_token_secret'] ?></dd>
</dl>
<a href="<?php echo url_for('/') ?>">back to top</a>
<?php }
function tpl_hello($vars)
{ extract($vars) ?>
<p>hello oauth!</p>
<dl>
<dt>url_name</dd>
<dd><?php echo $data['url_name'] ?></dd>
<dt>display_name</dt>
<dd><?php echo $data['display_name'] ?></dd>
</dl>
<?php }
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment