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

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

新規登録して質問してみよう
ただいま回答率
85.50%
PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Laravel 5

Laravel 5は、PHPフレームワークLaravelの最新バージョンで、2014年11月に発表予定です。ディレクトリ構造がが現行版より大幅に変更されるほか、メソッドインジェクションやFormRequestの利用が可能になります。

Q&A

解決済

1回答

421閲覧

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

yamayamak

総合スコア131

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Laravel 5

Laravel 5は、PHPフレームワークLaravelの最新バージョンで、2014年11月に発表予定です。ディレクトリ構造がが現行版より大幅に変更されるほか、メソッドインジェクションやFormRequestの利用が可能になります。

0グッド

0クリップ

投稿2017/09/01 08:18

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

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

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

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

php

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

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

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

php

1Route::get('/api_test', function () { 2 $client = new \GuzzleHttp\Client(); 3 $res = $client->request('POST', 'http://13.x.x.x/api/regist_user',[ 4 'form_params' => [ 5 'name' => 'testName2', 6 'email' => 'test2@gmail.com', 7 'password' => 'testpassword' 8 ], 9 ]); 10 echo $res->getBody(); 11 echo $res->getStatusCode(); 12});

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

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

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

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/01 17:16

編集2017/09/01 18:23
aro10

総合スコア4106

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

yamayamak

2017/09/01 23:16

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問