PHPに基づくOAuth 2.0認証プラットフォームの構築

12832 ワード

各ポータルは、Google、Facebook、QQ、Sina、Alibabaなどの3つのAPIを発売しています.本稿では、私たちのプロジェクトにOAuthを導入する方法について検討します.本文は主にfising兄の文章を参考にして、もっとはっきり言って、基本的にfising兄からパクリして来て、自分に記録を作って、fising兄が見た後に、気にしないでください.また、あなたの文章は確かによく書けていて、敬服させられます.
なぜoauthを使うのか、fising兄は非常に適切な比喩を作った.
サービスプロバイダSPは、庭を閉鎖するようなもので、カードを持っている人だけが入ることができ、ユーザーUはカードを持っている人の一人です.消費者Cはカードを持っていないので、通常は入れません.しかしある日、特殊な理由で、UはCがSPのところに何かを取りに行くのを手伝う必要がある.この时、问题は来ました:Cはカードを持っていないで、庭に入ることができなくて、Uはまたカードを直接Cにあげることができません(カードの上に多くの个人の机密の情报があって、外に漏らすのが不便です).どうしようかな?
ああ、そうだ、UはCを連れて入り口に行って、SPに伝えることができます:この人は私が知っているので、彼は中に入って私の同じものを持ってきて、放してください.このように,Uは個人情報付きのゲートカードをCに渡す必要もなく,Cも検証によりUに属するものを手に入れた.
ある人は、次のCがSPのUを取るものに入りたいなら、Uの案内は必要ないのではないかと聞きます.人類社会の状況は通常このようなものである.残念ながら、HTTPの世界では、HTTPは無状態のプロトコルであるため、SPは依然としてCを認識していない.だから、Cが物を取るたびに、いつもUの案内が必要です.面倒くさいのではないでしょうか.ほほほ.でも安全のために、面倒なことは何でもいい!
いくつかの公式の比喩は、
ジェーン(ユーザ、リソースの所有者)は、自分が休暇を取った写真(保護リソース)を画像共有サイトA(サービス提供者)にアップロードした.彼女は今、別のサイトB(Client、消費者)でオンラインでこれらの写真を印刷したいと思っています.一般的に、Janeは自分のユーザ名とパスワードを使用してサイトAにログインする必要があるが、Janeは自分のユーザ名とパスワードをサイトBに漏らすことを望んでいない.しかし、サイトBは画像共有サイトAの画像にアクセスして印刷する必要がある.
準備:
1 PHP+MYSQL環境2 libcurlのサポート(oauth-phpでcurlライブラリが使用されているため)3 OAuth-POPプロジェクトコード
私はxampp環境を使っているので、1つ目は満足しています.2つ目はphpだけです.iniファイルにlibcurl.soの前の;削除してapacheを再起動すればいいです.3つ目はoauth-phpコードをローカルにダウンロードする必要があります.
開始:
本稿はローカルlocalhostで実現されるため,いくつかのリソース共有問題に関連している.2つのディレクトリに一時的に配置します.
1 oauthdemoディレクトリ
2 oauthphpディレクトリ
この文書では、データベースにユーザー情報を格納する必要があります.次に、基本的なデータベースを作成する必要があります.
1 SQL、データベースphotoを作成し、テーブルuserとimageを作成し、初期データを記入します.
CREATE DATABASE `photo`;
 
CREATE TABLE IF NOT EXISTS `user` (
  `userId` INT(11) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '  ID',
  `userName` VARCHAR(20) NOT NULL COMMENT '   ',
  `password` CHAR(32) NOT NULL COMMENT '    ',
  PRIMARY KEY (`userId`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='     ' AUTO_INCREMENT=1 ;

CREATE TABLE IF NOT EXISTS `image` (
  `imageId` INT(11) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '  Id',
  `userId` INT(11) UNSIGNED NOT NULL COMMENT '  Id',
  `imagePath` VARCHAR(255) NOT NULL COMMENT '    ',
  PRIMARY KEY (`imageId`),
  KEY `userId` (`userId`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='   ' AUTO_INCREMENT=1 ;

INSERTINTO`photo`.`user` (
 `userId` ,
 `userName` ,
 `password`
)
VALUES (
 '1','jane', MD5('123456')
);
 
INSERTINTO`photo`.`image` (
 `imageId` ,
 `userId` ,
 `imagePath`
)
VALUES (
 NULL ,'1','path/to/jane/image.jpeg'
);

2 OAuth-phpの基本的なデータテーブル情報を確立する必要がある.
カタログ(私の機械、他の機械の類推):
E:\xampp\htdocs\oauthphp\oauth-php\library\store\mysql
中にはphpファイルはmysqlに接続するコメント部分を削除し、コードは以下の通りです.
<?php

/**
 * Installs all tables in the mysql.sql file, using the default mysql connection
 */

/* Change and uncomment this when you need to: */


mysql_connect('localhost', 'root');
if (mysql_errno())
{
    die(' Error '.mysql_errno().': '.mysql_error());
}
mysql_select_db('oauthdemo');


$sql = file_get_contents(dirname(__FILE__) . '/mysql.sql');
$ps  = explode('#--SPLIT--', $sql);

foreach ($ps as $p)
{
    $p = preg_replace('/^\s*#.*$/m', '', $p);
   
    mysql_query($p);
    if (mysql_errno())
    {
        die(' Error '.mysql_errno().': '.mysql_error());
    }
}

?>

次にブラウザで実行します.
http://localhost/oauthphp/oauth-php/library/store/mysql/install.php
データベースの初期化が完了しました.
そしてフィッシング兄のブログに従って、対応するphpファイルを完成します.ここを回って、皆さんが読むのに便利です:本文のoauthphpディレクトリ:
configを作成する.inc.phpファイル:
<?php
//        
$dbOptions = array(
    'server'   => 'localhost',
    'username' => 'root',
    'password' => '',
    'database' => 'photo'
);
?>

作成oauth_register.php:
 
<?php
//       
$user_id = 1;
 
//       
$consumer = array(
    //       
    'requester_name'         => 'Fising',
    'requester_email'        => '[email protected]',
 
    //       
    'callback_uri'           => 'http://www.demo.com/oauth_callback',
    'application_uri'        => 'http://www.demo.com/',
    'application_title'      => 'Online Printer',
    'application_descr'      => 'Online Print Your Photoes',
    'application_notes'      => 'Online Printer',
    'application_type'       => 'website',
    'application_commercial' => 0
);
 
include_once 'config.inc.php';
include_once 'oauth-php/library/OAuthStore.php';
 
//      
$store = OAuthStore::instance('MySQL', $dbOptions);
$key   = $store->updateConsumer($consumer, $user_id);
 
//        
$consumer = $store->getConsumer($key, $user_id);
 
//           App Key   App Secret
$consumer_id     = $consumer['id'];
$consumer_key    = $consumer['consumer_key'];
$consumer_secret = $consumer['consumer_secret'];
 
//       
echo 'Your App Key: ' . $consumer_key;
echo '<br />';
echo 'Your App Secret: ' . $consumer_secret;
?>

ブラウザでこのphpファイルを実行します.
http://localhost/oauthphp/oauth-php/oauth_register.php
アプリケーションを自動的に登録することに相当します(実際には消費者Clientです).そして、このアプリケーションのApp KeyとApp Secretをあなたに提示します.以下www.demo.comサイトでは、この2つの文字列を使用して認証されます.だから今、この2つの値を保存しておきます.
次の操作を行います.
Your App Key: 07be533fdd42a946e214a1a487b8943704f4c9501 Your App Secret: fb4c7f6a36f7941ce311d63dbf46c383
これで、消費者登録機能が完了します.
次に、消費者のoauthdemoは、このApp KeyとApp Secretを使用して、認証サーバに不正なRequest tokenを要求することができます.このステップでは、1消費者のoauthdemoがOAuthサーバ、すなわちoauthphpに不正なRequest tokenを要求すること.②OAuth Serverは消費者の要求を処理し、許可されていないRequest tokenを生成して消費者に返す.
再作成ファイルrequest_token.php
 
<?php
include_once 'config.inc.php';
include_once 'oauth-php/library/OAuthStore.php';
include_once 'oauth-php/library/OAuthServer.php';
 
$store = OAuthStore::instance('MySQL', $dbOptions);
 
$server = new OAuthServer();
$server->requestToken();
exit();
?>

認証サーバは、消費者の要求に「不正なtoken」を応答できるようになりました.
次に、別のサーバを構成する必要があります.demoサーバです.
oauthdemoデータベースの作成、使用
http://localhost/oauthdemo/oauth-php/library/store/mysql/install.php
を使用して基本データベーステーブルを作成しますが、接続データベースをoauthdemoデータベースに変更する必要があります.ファイルは次のとおりです.
<?php

/**
 * Installs all tables in the mysql.sql file, using the default mysql connection
 */

/* Change and uncomment this when you need to: */


mysql_connect('localhost', 'root');
if (mysql_errno())
{
    die(' Error '.mysql_errno().': '.mysql_error());
}
mysql_select_db('oauthdemo');


$sql = file_get_contents(dirname(__FILE__) . '/mysql.sql');
$ps  = explode('#--SPLIT--', $sql);

foreach ($ps as $p)
{
    $p = preg_replace('/^\s*#.*$/m', '', $p);
   
    mysql_query($p);
    if (mysql_errno())
    {
        die(' Error '.mysql_errno().': '.mysql_error());
    }
}

?>

ディレクトリoauthdemoで次のファイルを作成します:config.inc.php
<?php
//        
$dbOptions = array(
    'server'   => 'localhost',
    'username' => 'root',
    'password' => '',
    'database' => 'oauthdemo'
);
?>

次に、消費者サーバのルートディレクトリにファイルを追加し続け、add_server.phpは、消費者のデータベースに認証サーバの情報を格納するために使用される.一般的には、この情報はプロファイルに直接書かれる可能性がありますが、oauth-phpはより強力なデータベースのストレージスキームを提供しています.このファイルの内容は次のとおりです.
<?php
include_once 'config.inc.php';
include_once 'oauth-php/library/OAuthStore.php';
 
$store = OAuthStore::instance('MySQL', $dbOptions);
 
//      ID,      
$user_id = 1;
 
//        
$server = array(
    'consumer_key'      => '07be533fdd42a946e214a1a487b8943704f4c9501',
    'consumer_secret'   => 'fb4c7f6a36f7941ce311d63dbf46c383',
    'server_uri'        => 'http://localhost/oauthphp/',
    'signature_methods' => array('HMAC-SHA1', 'PLAINTEXT'),
    'request_token_uri' => 'http://localhost/oauthphp/request_token.php',
    'authorize_uri'     => 'http://localhost/oauthphp/authorize.php',
    'access_token_uri'  => 'http://localhost/oauthphp/access_token.php'
);
 
//           OAuthStore  
$consumer_key = $store->updateServer($server, $user_id);
?>

このように、ブラウザでファイルにアクセスすると、http://localhost/oauthdemo/add_server.php、サーバーに関する情報が保存されます.本番プロセスで使用する場合、認証サーバのリストを管理するための簡単な管理システムである可能性があります.上のファイルのkeyとsecretは私たちが認証サーバにいたことに注意してください.http://localhost/oauthphp消費者側のアプリケーションを登録したときに得られたものです.
認証サーバに関する情報があれば、「未認証のtoken」を取得できます.にあるhttp://localhost/oauthdemo/ルートディレクトリに新しいファイルindexを作成します.php:
<?php
if(isset($_GET['req']) && ($_GET['req'] == 1)){
    include_once 'config.inc.php';
    include_once 'oauth-php/library/OAuthStore.php';
    include_once 'oauth-php/library/OAuthRequester.php';
 
    $store = OAuthStore::instance('MySQL', $dbOptions);
 
    //   Id,      
    $user_id = 1;
 
    //    key
    $consumer_key = '07be533fdd42a946e214a1a487b8943704f4c9501';
 
    //           token
    $token = OAuthRequester::requestRequestToken($consumer_key, $user_id);
    var_dump($token);
    die();
}
else{
?>
    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    <html xmlns="http://www.w3.org/1999/xhtml">
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    <title>    </title>
    </head>
 
    <body>
    <p>       ,           </p>
    <input type="button" name="button" value="Click Me" id="RequestBtn"/>
    <script type="text/javascript">
    document.getElementById('RequestBtn').onclick = function(){
        window.location = 'index.php?req=1';
    }
    </script>
    </body>
    </html>
<?php
}
?>

ここで注意してください.原文ここには小さな問題があります.fishing兄が油断したかもしれません.$consumerです.keyの設定が間違っていて、メッセージを残したいのですが、なぜか登録できません.
実行http://localhost/oauthdemo/index.php?req=1次のように返されます.
array(2) { ["authorize_uri"]=> string(39) “http://localhost/oauthphp/authorize.php” ["token"]=> string(41) “6959214bfc5c2a946052ea805292c7cc04f4f600f” }
「不正なtoken」を取得するには、順調に完了しました.
次に、OAuth検証のプロセスに従って、ユーザーブラウザにリダイレクトする必要があります.http://localhost/oauthphp/tokenライセンスを行います.
にあるhttp://localhost/oauthdemo/サーバルートディレクトリに新しいファイルauthorizeを作成します.php、コードは以下の通りです.
<?php
session_start();
 
if (empty($_SESSION['authorized']))
{
    $uri = $_SERVER['REQUEST_URI'];
    header('Location: /login.php?goto=' . urlencode($uri));
    exit();
}
 
include_once 'config.inc.php';
include_once 'oauth-php/library/OAuthStore.php';
include_once 'oauth-php/library/OAuthServer.php';
 
//    
$user_id = 1;
 
//    oauth store   oauth server   
$store = OAuthStore::instance('MySQL', $dbOptions);
$server = new OAuthServer();
 
try
{
    //                   token
    //       ,   consumer key, consumer secret, token, token secret   token type.
    $rs = $server->authorizeVerify();
 
    if ($_SERVER['REQUEST_METHOD'] == 'POST')
    {
        //           "allow"   (             )
        $authorized = array_key_exists('allow', $_POST);
 
        //   token     (           )
        //      oauth_callback   ,       (   )  
        $server->authorizeFinish($authorized, $user_id);
 
        //      oauth_callback   ,       
        // **      **
    }
    else
    {
        echo 'Error';
    }
}
catch (OAuthException $e)
{
    //        token,            token        
    // **      **
}
?>

コードを添付しましょう:htdocs
参考記事:
1 http://www.fising.cn/2011/03/%E4%B8%80%E6%AD%A5%E4%B8%80%E6%AD%A5%E6%90%AD%E5%BB%BA-oauth-%E8%AE%A4%E8%AF%81%E6%9C%8D%E5%8A%A1%E5%99%A8.shtml 2 http://www.fising.cn/?p=581 3 http://oauth.net/documentation/getting-started/4 http://lds2008.blogbus.com/tag/OAuth/5 http://iamcaihuafeng.blog.sohu.com/154447409.html 6 http://www.cnblogs.com/youxilua/archive/2011/12/29/2306790.html 7 http://www.fising.cn/2011/06/%E5%9F%BA%E4%BA%8Ephp%E7%9A%84oauth%E8%AE%A4%E8%AF%81%E6%9C%8D%E5%8A%A1%E5%99%A8%E7%9A%84%E6%90%AD%E5%BB%BA.shtml