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

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

ただいまの
回答率

89.20%

Android app から Laravel app へPOST送信したい csrf-tokenの取り扱い

解決済

回答 2

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 379

old_dog

score 34

下記リンクサイト様を参考に、Android app から Laravel appへPOST送信するコードを作成しようと試みていますが実現できません。

https://stackoverflow.com/questions/31627477/access-laravel-app-from-android-app-with-csrf-token

上記の参照コードは、非推奨となっているメソッドが幾つかありましたので、色々調べながら下記コードを考えたのですが、上手くいきません。Internal Server Errorになります。作成しているコードは、接続したいLaravel app のXSRF-TOKENを取得して、post送信モードにする、という感じのコードです。

Android app から Laravel appに、Post送信するのには、どうしたらいいのでしょうか?

    protected void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        textView = findViewById(R.id.textView);
        new Thread(new Runnable() {
            @Override
            public void run() {
                String site  = "http://192.168.xxx.xxx:8000";
                    try {
                    HttpURLConnection getConnection = (HttpURLConnection) new URL(site).openConnection();
                      Map<String,List<String>> header = getConnection.getHeaderFields();
                      List<String> cookies = header.get("set-cookie");
                      String cookie = cookies.get(0);
                      String token = HttpCookie.parse(cookie).get(0).getValue();

                    HttpURLConnection postConnection = (HttpURLConnection) new URL(site).openConnection();
                      postConnection.setRequestMethod("POST");
                      postConnection.setDoOutput(true);
                      postConnection.setRequestProperty("X-XSRF-TOKEN",token);
                      postConnection.connect();

                    getConnection.disconnect();
                    postConnection.disconnect();

                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }).start();
    }

■ Laravel側のコードです

Route::get  ('/','Laravel01Controller@getIndex');
Route::post ('/','Laravel01Controller@postIndex');
class Laravel01Controller extends Controller
{
    public function getIndex(Request $request){
      return view('hello');
    }

    public function postIndex(Request $request){
      return view('hello');
}   }
hello

■ エラー情報です
通信方法を'get'で指定すると、リクエストコードは200が返ってきます。

[2019-10-05 14:23:46] local.ERROR: The payload is invalid. {"exception":"[object] (Illuminate\\Contracts\\Encryption\\DecryptException(code: 0): The payload is invalid. at D:\\privatePro\\laravel\\larave01\\vendor\\laravel\\framework\\src\\Illuminate\\Encryption\\Encrypter.php:195)
[stacktrace]

#0 D:\\privatePro\\laravel\\larave01\\vendor\\laravel\\framework\\src\\Illuminate\\Encryption\\Encrypter.php(136): Illuminate\\Encryption\\Encrypter->getJsonPayload(NULL)

#1 D:\\privatePro\\laravel\\larave01\\vendor\\laravel\\framework\\src\\Illuminate\\Foundation\\Http\\Middleware\\VerifyCsrfToken.php(154): Illuminate\\Encryption\\Encrypter->decrypt('eyJpdiI6ImhBeW4...', false)

#2 D:\\privatePro\\laravel\\larave01\\vendor\\laravel\\framework\\src\\Illuminate\\Foundation\\Http\\Middleware\\VerifyCsrfToken.php(136): Illuminate\\Foundation\\Http\\Middleware\\VerifyCsrfToken->getTokenFromRequest(Object(Illuminate\\Http\\Request))

#3 D:\\privatePro\\laravel\\larave01\\vendor\\laravel\\framework\\src\\Illuminate\\Foundation\\Http\\Middleware\\VerifyCsrfToken.php(74): Illuminate\\Foundation\\Http\\Middleware\\VerifyCsrfToken->tokensMatch(Object(Illuminate\\Http\\Request))

#4 D:\\privatePro\\laravel\\larave01\\vendor\\laravel\\framework\\src\\Illuminate\\Pipeline\\Pipeline.php(171): Illuminate\\Foundation\\Http\\Middleware\\VerifyCsrfToken->handle(Object(Illuminate\\Http\\Request), Object(Closure))

#5 D:\\privatePro\\laravel\\larave01\\vendor\\laravel\\framework\\src\\Illuminate\\View\\Middleware\\ShareErrorsFromSession.php(49): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request))

#6 D:\\privatePro\\laravel\\larave01\\vendor\\laravel\\framework\\src\\Illuminate\\Pipeline\\Pipeline.php(171): Illuminate\\View\\Middleware\\ShareErrorsFromSession->handle(Object(Illuminate\\Http\\Request), Object(Closure))

#7 D:\\privatePro\\laravel\\larave01\\vendor\\laravel\\framework\\src\\Illuminate\\Session\\Middleware\\StartSession.php(56): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request))

#8 D:\\privatePro\\laravel\\larave01\\vendor\\laravel\\framework\\src\\Illuminate\\Pipeline\\Pipeline.php(171): Illuminate\\Session\\Middleware\\StartSession->handle(Object(Illuminate\\Http\\Request), Object(Closure))

#9 D:\\privatePro\\laravel\\larave01\\vendor\\laravel\\framework\\src\\Illuminate\\Cookie\\Middleware\\AddQueuedCookiesToResponse.php(37): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request))

#10 D:\\privatePro\\laravel\\larave01\\vendor\\laravel\\framework\\src\\Illuminate\\Pipeline\\Pipeline.php(171): Illuminate\\Cookie\\Middleware\\AddQueuedCookiesToResponse->handle(Object(Illuminate\\Http\\Request), Object(Closure))

#11 D:\\privatePro\\laravel\\larave01\\vendor\\laravel\\framework\\src\\Illuminate\\Cookie\\Middleware\\EncryptCookies.php(66): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request))

#12 D:\\privatePro\\laravel\\larave01\\vendor\\laravel\\framework\\src\\Illuminate\\Pipeline\\Pipeline.php(171): Illuminate\\Cookie\\Middleware\\EncryptCookies->handle(Object(Illuminate\\Http\\Request), Object(Closure))

#13 D:\\privatePro\\laravel\\larave01\\vendor\\laravel\\framework\\src\\Illuminate\\Pipeline\\Pipeline.php(105): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request))

#14 D:\\privatePro\\laravel\\larave01\\vendor\\laravel\\framework\\src\\Illuminate\\Routing\\Router.php(682): Illuminate\\Pipeline\\Pipeline->then(Object(Closure))

#15 D:\\privatePro\\laravel\\larave01\\vendor\\laravel\\framework\\src\\Illuminate\\Routing\\Router.php(657): Illuminate\\Routing\\Router->runRouteWithinStack(Object(Illuminate\\Routing\\Route), Object(Illuminate\\Http\\Request))

#16 D:\\privatePro\\laravel\\larave01\\vendor\\laravel\\framework\\src\\Illuminate\\Routing\\Router.php(623): Illuminate\\Routing\\Router->runRoute(Object(Illuminate\\Http\\Request), Object(Illuminate\\Routing\\Route))

#17 D:\\privatePro\\laravel\\larave01\\vendor\\laravel\\framework\\src\\Illuminate\\Routing\\Router.php(612): Illuminate\\Routing\\Router->dispatchToRoute(Object(Illuminate\\Http\\Request))

#18 D:\\privatePro\\laravel\\larave01\\vendor\\laravel\\framework\\src\\Illuminate\\Foundation\\Http\\Kernel.php(176): Illuminate\\Routing\\Router->dispatch(Object(Illuminate\\Http\\Request))

#19 D:\\privatePro\\laravel\\larave01\\vendor\\laravel\\framework\\src\\Illuminate\\Pipeline\\Pipeline.php(130): Illuminate\\Foundation\\Http\\Kernel->Illuminate\\Foundation\\Http\\{closure}(Object(Illuminate\\Http\\Request))

#20 D:\\privatePro\\laravel\\larave01\\vendor\\laravel\\framework\\src\\Illuminate\\Foundation\\Http\\Middleware\\TransformsRequest.php(21): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request))

#35 {main}
"} 
  • 気になる質問をクリップする

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

質問への追記・修正、ベストアンサー選択の依頼

  • CHERRY

    2019/10/05 12:39

    エラーが発生した際のWeb サーバーのログと関係するサーバー側のソースコードを質問に追記できないでしょうか?

    キャンセル

  • old_dog

    2019/10/05 17:32

    ありがとうございます。Laravelのログ(20番以降は文字数制限のため削除しました)と、ソースコードを記載しました。貴重なお時間を頂きましてありがとうございます。

    キャンセル

回答 2

+1

Internal Server Errorの場合は
プログラムにエラー(Syntaxエラーや、実行時エラー)が発生しているはずなので
CSRFトークン云々とは別の問題かと思われます

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2019/10/05 17:34

    ありがとうございます。シンタックスエラーや実行時エラーをチェックしてみます。

    キャンセル

check解決した方法

0

数日間、色々と調べたり悩んでみました。考えてみれば、認証されていない端末からLaravelappに接続して、xsrf-tokenを取得してPOST送信できたら、CSRF対策してる意味が無くなってしまう、という超初歩的なことに気が付きました。解決方法は、CSRF対策の必要のない方法で通信するか、CSRF対策から特定端末を除外する、という基本的な方法、ということなのでしょうね。ご助言くださった皆様、貴重なお時間をすみませんでした。ありがとうございました。自戒の想いを込めて。

投稿

編集

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

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

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