質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

89.98%

Laravel5.4PassportでスマホAPI作成時のCSRF実装

解決済

回答 1

投稿

  • 評価
  • クリップ 0
  • VIEW 1,169

yamayamak

score 86

Laravel5.4でPassport(パスワードグラント)を使って、スマホ向けAPIを作成しています。

パスワードグラントのClientを作成はうまくいっているように見えます。(Emailとパスワードでアクセストークンの払い出し)

Routeを以下のように設定して

User追加の開発をしていますがクライアントから
route/api.php

Route::post('/regist_user', 'Auth\RegisterController@create');


でpassportインストールで生成されたControllerをそのまま使ってます。

試験は以下のように設定してURLにアクセスしています。
route/web.php

Route::get('/api_test', function () {
    $client = new \GuzzleHttp\Client();
    $res = $client->request('POST', 'http://13.x.x.x/api/regist_user',[
        'form_params' => [
            'name' => 'testName2',
            'email' => 'test2@gmail.com',
            'password' => 'testpassword'
        ],
    ]);
    echo $res->getBody();
    echo $res->getStatusCode();
});

以下のようなエラーが発生します。
Symfony\Component\Debug\Exception\FatalThrowableError: Type error: Too few arguments to function A (truncated...)

CSRFトークンの実装が無いからだと思っていますが、どのように実装するのが良いのでしょうか?
個別にUserControllerを設定していくのが通常と考えて問題ないのでしょうか?
今後、メール確認なども実装していく予定なのでどのようにすべきかご意見をお願いします。
今後、スマホアプリ開発時にも必要ですので、教えて頂ければと思います。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

checkベストアンサー

+1

5.4でphp artisan make:auth で作成された、RegisterControllerとするならば、createメソッドはprotectedメソッドでルータ定義から呼び出す事を想定されていません。
よってarray $dataが解決できず、Too few argumentsエラーになっているのかと思います。
正しくは、

Route::post('/regist_user', 'Auth\RegisterController@register');


かと思います。
詳細はRegisterControllerでuseしているIlluminate\Foundation\Auth\RegistersUsersを参照してください。

[サンプルプログラム]
registerメソッドそのままでは、Passport用になっていなかったので、以下の情報を元に即席ですがregisterメソッドをPassportに対応できるようにしてみたので参考にしてください。

Registering User with Laravel Passport

public function register(Request $request)
{
    $this->validator($request->all())->validate();

    event(new Registered($user = $this->create($request->all())));

   #以下をLaravel Passport用に修正

    #php artisan passport:client --passwordでパスワードグラントクライアントを事前に作成しておく
    #Laravel\Passport\Client
    $client = Client::where('password_client', 1)->first();

    $request->request->add([
        'grant_type'    => 'password',
        'client_id'     => $client->id,
        'client_secret' => $client->secret,
        'username'      => $request->input('email'),
        'password'      => $request->input('password'),
        'scope'         => null,
    ]);

    $tokenRequest = \Request::create(
        'oauth/token',
        'POST'
    );
    return \Route::dispatch($tokenRequest);
}

LaravelからのHTTPレスポンスがJSON用になるように、Guzzleクライアントにheaderを追加しました。

Route::get('/api_test', function () {
    $client = new \GuzzleHttp\Client();
    $res = $client->request('POST', 'http://teratailtestandlaravelpassport.dev/api/regist_user',[
        'headers'        => ['Accept' => 'application/json'],
        'form_params' => [
            'name' => 'testName',
            'email' => 'test@gmail.com',
            'password' => 'testpassword'
        ],
    ]);

    echo $res->getBody();
    echo $res->getStatusCode();
});

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/09/02 08:16

    いつも丁寧な説明ありがとうございます!
    php artisan make:auth で作成しました。
    Illuminate\Foundation\Auth\RegistersUsersの中で書き換えて対応するのですね。
    また、Guzzleクライアントの修正もありがとうございます。
    いろいろ助かります。ありがとうございましたm(__)m

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 89.98%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる