3

私の symfony2 プロジェクトでは、Web サイトでのログイン、登録などに FOSUSerBundle を使用しています。私が期待したように、うまく動作します。しかし今、REST API を構築して、Android アプリがクライアントとして機能し、データを操作できるようにしたいと考えています。symfony2 プロジェクト内で REST API をビルドするための FOSRestBundle を見つけました。APIにアクセスするためのトークンを処理するためにFOSOAuthServerBundleを使用したいと考えています。ユーザーは API 経由でログインする必要があり、その後、API によって提供される他のメソッドを使用できます。

多くのブログやその他のドキュメントを読みましたが、REST Api を構築する方法が見つかりません。各バンドルをセットアップし、パブリック ID とセキュア コードを使用してクライアントを生成しました。ウェブサイト上でログインを使用できます。

しかし、トークン認証を使用するには、REST API コントローラーでどのような手順/方法を定義する必要がありますか?

ありがとうございました!

4

2 に答える 2

0

このリンクでは、最初の REST API を開発するための良い例を見つけることができます。

幸運を。

于 2014-05-14T16:06:26.253 に答える
0

最近、FOSUser FOSOAuthServer と FOSRest バンドルを使用して API をセットアップしました。

私のsecurity.ymlには次のものがあります:

security:

    encoders:
        FOS\UserBundle\Model\UserInterface: bcrypt

    role_hierarchy:
        ROLE_ADMIN:       ROLE_USER
        ROLE_SUPER_ADMIN: ROLE_ADMIN

    providers:
        fos_userbundle:
            id: fos_user.user_provider.username

    firewalls:
        # disables authentication for assets and the profiler, adapt it according to your needs
        dev:
            pattern: ^/(_(profiler|wdt)|css|images|js)/
            security: false

        oauth_token:                                   # Everyone can access the access token URL.
            pattern: ^/login
            security: false

        api:
            pattern: /                                 # All URLs are protected
            fos_oauth: true                            # OAuth2 protected resource
            stateless: true                            # Do no set session cookies
            anonymous: false

    access_control:
        - { path: ^/login$, role: IS_AUTHENTICATED_ANONYMOUSLY }
        - { path: ^/register, role: IS_AUTHENTICATED_ANONYMOUSLY }
        - { path: ^/resetting, role: IS_AUTHENTICATED_ANONYMOUSLY }
        - { path: ^/admin/, role: ROLE_ADMIN }

これにより、ログイン ルートへの匿名アクセスが許可されますが、他のすべてのルートでは認証が必要になります。

リクエストを OAuth クライアントにプロキシするログイン ルートを作成しました。このようにして、ユーザーはクライアントの秘密を知ることはありません: (例ではクライアント ID と秘密を削除したことに注意してください)

/**
 * @Post("/login")
 */
public function postLoginAction(Request $request){
    $request->request->add( array(
        'grant_type' => 'password',
        'client_id' => 'clientID_clientRandomID',
        'client_secret' => 'clientSecret'
    ));

    return($this->get('fos_oauth_server.controller.token')->tokenAction($request));
}

有効なユーザー/パスが送信された場合、これは OAuth トークンを返します。

このトークンを取得したら、リクエストのヘッダーに追加できます

Authorization: Bearer OAuth_TOKEN 

ユーザーが検証されると、必要に応じて、API 呼び出しでいつでもロールを確認できます。次のようなもの:

public function getUserAction()
{
    $this->denyAccessUnlessGranted('ROLE_ADMIN', null, 'Unable to access this page!');

    $user = $this->getUser();

    $view = $this->view($user);
    return $this->handleView($view);
}  

ロールをチェックする別の方法は、security.yml で実行できます。

# app/config/security.yml
security:
# ...
    access_control:
        - path: "^/api/users/\d+$"
          allow_if: "'DELETE' == request.getMethod() and has_role('ROLE_ADMIN')"

これは次の投稿で見つけました: RESTFul OAuth with FOSOAuthServer / FOSRest & FOSUser

これは私が Symfony3 ビルドにアプローチした方法です。Symfony2 では一部の構文 (ユーザー ロールのチェック) が異なる場合があります。

APIを構築する際に、この投稿を参考にしました: http://williamdurand.fr/2012/08/02/rest-apis-with-symfony2-the-right-way/

于 2016-02-12T22:42:03.693 に答える