2

私はphpとZendを使用したWebサイト(siteAと呼びます)を持っています。別のサイト(SiteBと呼びます)から自分のサイト(SiteA)の制限された領域にアクセスするためのAPIを実装しようとしています。

SiteB の資格情報を使用して siteB のユーザーを認証し、ユーザーが API を介して認証された siteA への html iframe を使用できるようにしたいと考えています。

私は新しいので、正しい方向に向かっているかどうかはよくわかりません。

これまでのところ、安らかなAPIを使用することを考えていました.フレーム外ではユーザーは検証されますが、フレーム内ではユーザーは検証されません.

提案とヘルプ? そして、私のコードは次のとおりです。

----- SiteB ユーザー/index.php ----

<html>
<body>
<?php
  $postdata = http_build_query(
   array(            
    'userid' => 'someid',
    'key' => 'somekey',
    'public' => '1'
   )
  );

$opts = array('http' =>
  array(
    'method'  => 'POST',
    'header'  => 'Content-type: application/x-www-form-urlencoded',
    'content' => $postdata
   )
 );

$context = stream_context_create($opts);
file_get_contents('https://www.siteA.com/api', false, $context);
?>

<iframe src="https://www.siteA.com/" width="950" height="700"></iframe>
</body>
</html>

----- サイト A ---------

<?php

class ApiController extends Zend_Controller_Action
{

    public function init()
    {
        /* Initialize action controller here */
        $this->_helper->viewRenderer->setNoRender(true);
        $this->_helper->layout->disableLayout();
    }


    public function indexAction() {
        if($this->getRequest()->isPost()){        
            $data = $this->_request->getPost();
            $this->_authenticateApi($data);
        }
        else{
            //error
        }

}
 public function _authenticateApi($data){
    $db = Zend_Registry::get('db_local');

    $authAdapter = new Zend_Auth_Adapter_DbTable($db);

    $authAdapter->setTableName('sometable');
    $authAdapter->setIdentityColumn('id');
    $authAdapter->setCredentialColumn('key');


    $authAdapter->setIdentity($data['id']);
    $authAdapter->setCredential($data['key']);

    $auth = Zend_Auth::getInstance();
    $result = $auth->authenticate($authAdapter);

    if($result->isValid()){
        if($data['public'] == "1"){
            Zend_Session::rememberMe(1209600);
        }else{
            Zend_Session::forgetMe();
        }
        return true;
    } else {
        return false;
    }
}
4

2 に答える 2

2

私は最近この問題に直面しました。iframe を使用しなければならない理由はありますか? 私にはハックのように感じます。

これを行う方法はたくさんありますが、私が読んだ限りでは、ベスト プラクティスは、HTTP Auth Basic を使用してクライアントを認証し、HTTPS (SSL 証明書) を使用して接続を暗号化することを API に要求させることです。この場合、API はセッションを管理しません。API を直接参照している場合に通常の Web ブラウザーが行うように、すべての要求には Auth Basic ヘッダーが含まれます。

次に、SiteB を使用して、ユーザーがログインすると、資格情報を自分の$_SESSIONまたは同様の場所に保存し、API 要求を行うたびにそれらを使用します。

Subbu Allamaraju 著のRESTful Web Services Cookbookは、私が最近読んだ素晴らしい本で、これやその他の重要な RESTful API の詳細について説明しています。

ところで、エントリ URL と API 機能のメディア タイプの知識が与えられただけで、クライアントが URL をすべて自分で把握できない限り、実際には RESTful ではありません。詳細については、HATEOAS を検索してください。

また、これらすべてを JavaScript で実行しようとして、SiteA と SiteB が同じドメインを共有していない場合、JsonP を使用して API リクエストを処理する必要がある場合があります。それは可能ですが、私見では望ましくありません。Zend_Http_ClientSiteB の PHP コードで使用して、すべての API 通信を行います。これにより、ドメイン名の問題を回避できます。これにより、API が詮索好きな目 (右クリックしてソースを表示) から隠され、クロスブラウザーの互換性の問題がサイトのコア機能に干渉する可能性が最小限に抑えられます。

于 2012-06-12T22:30:41.837 に答える
0

トークンを使用して、JS で認証を行い、Javascript 変数に保存するトークンを取得し、そのトークンを使用してサイト A またはサイト B への「新しい」接続を行うことができます。

セキュリティの問題について理解するには、OAuth についてもお読みください。あなたの最終的な目的が何なのかわからない... これらは私の 2 セントです。

よろしくお願いします、

于 2012-06-12T22:30:32.553 に答える