3

アプリケーションで API ユーザーを認証する方法が見つかりません。最初は、ユーザーが Web 経由でアクセスして認証できるシステムの構築に着手しましたが、要件が変更されたため、POST API 呼び出しを使用して RESTful な方法で利用できる追加のアクションを実装する必要があります。

CBehaviour認証されていないすべてのユーザーのログイン ページへのリダイレクトを強制的に拡張するクラスを作成しました(ここの yii フレームワーク フォーラムにあります)。問題は、すべての API 呼び出しが同じロジックを介して強制され、POST 要求が単純に HTML をログイン ページに吐き出すことです。

class ApplicationBehavior extends CBehavior {
    private $_owner;

    public function events() {
        return array(
            'onBeginRequest' => 'forceGuestLogin',
        );
    }

    public function forceGuestLogin() {
        $owner = $this->getOwner();
        if ($owner->user->getIsGuest())
            $owner->catchAllRequest = array("site/login");
    }
}

API ユーザーの認証を Web ユーザーから分離するにはどうすればよいですか?

4

1 に答える 1

3

Yii で REST API を作成するには、このガイドに従います。config urlManager エントリを変更すると、すべての API リクエストで APIController が使用されます。次に、APIController の beforeAction に次のコードを配置して、ユーザーがゲストの場合 (またはエラー メッセージ) を返さないようにすることができます。

protected function beforeAction($event) {
    if (Yii::app()->user->isGuest) {
        echo "Invalid credentials";
        Yii::app()->end();
    }
}

注: 上記のコードは、すべての REST 要求が同じブラウザーを介して送信されるため、私の目的に適しています。(すでにログインしており、ログイン Cookie を持っている)

その動作を、protected/controllersログインを強制するために配置された新しい基本コントローラーに置き換えると、ログインが必要なページにのみ適用され、APIController には適用されません。これが私の例です:

//Make sure all Controllers which require a login inherit from this
class ControllerLoginRequired extends CController {
    public function runAction($action) {
        if (Yii::app()->user->isGuest && 'site' != $this->route) {
           Yii::app()->user->returnUrl = $this->route;
           parent::redirect(array('site/login'));
        } else {
           parent::runAction($action);
        }
    }
}

説明されていることはすべて、ユーザーが Yii にログオンしたのと同じブラウザーを介した REST 要求に対して機能します。Yii にログインしているブラウザではない消費者に REST サービスを公開する必要がある場合は、カスタムの認証/トークン スキームを考え出す必要があると思います。

于 2013-07-30T22:18:52.190 に答える