🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
HTTP

HTTP(Hypertext Transfer Protocol)とはweb上でHTML等のコンテンツを交換するために使われるアプリケーション層の通信プロトコルです。

Laravel

LaravelとはTaylor Otwellによって開発された、オープンソースなPHPフレームワークです。Laravelはシンプルで表現的なシンタックスを持ち合わせており、ウェブアプリケーション開発の手助けをしてくれます。

POST

POSTはHTTPプロトコルのリクエストメソッドです。ファイルをアップロードしたときや入力フォームが送信されたときなど、クライアントがデータをサーバに送る際に利用されます。

Android

Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

Q&A

解決済

2回答

2849閲覧

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

old_dog

総合スコア51

HTTP

HTTP(Hypertext Transfer Protocol)とはweb上でHTML等のコンテンツを交換するために使われるアプリケーション層の通信プロトコルです。

Laravel

LaravelとはTaylor Otwellによって開発された、オープンソースなPHPフレームワークです。Laravelはシンプルで表現的なシンタックスを持ち合わせており、ウェブアプリケーション開発の手助けをしてくれます。

POST

POSTはHTTPプロトコルのリクエストメソッドです。ファイルをアップロードしたときや入力フォームが送信されたときなど、クライアントがデータをサーバに送る際に利用されます。

Android

Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

0グッド

0クリップ

投稿2019/10/04 14:00

編集2019/10/05 08:31

下記リンクサイト様を参考に、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

1Route::get ('/','Laravel01Controller@getIndex'); 2Route::post ('/','Laravel01Controller@postIndex');

Controller

1class Laravel01Controller extends Controller 2{ 3 public function getIndex(Request $request){ 4 return view('hello'); 5 } 6 7 public function postIndex(Request $request){ 8 return view('hello'); 9} }

hello

1hello

■ エラー情報です
通信方法を'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} "}

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

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

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

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

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

CHERRY

2019/10/05 03:39

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

2019/10/05 08:32

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

回答2

0

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

投稿2019/10/05 03:12

mikkame

総合スコア5036

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

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

old_dog

2019/10/05 08:34

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

0

自己解決

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

投稿2019/10/05 11:54

編集2019/10/05 12:22
old_dog

総合スコア51

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問