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

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

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

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

PHP

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

React.js

Reactは、アプリケーションのインターフェースを構築するためのオープンソースJavaScriptライブラリです。

Q&A

解決済

2回答

9499閲覧

laravel8にてAuth::id()でユーザーID を取得できない。

it-tsumugi

総合スコア11

Laravel

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

PHP

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

React.js

Reactは、アプリケーションのインターフェースを構築するためのオープンソースJavaScriptライブラリです。

0グッド

1クリップ

投稿2021/08/21 15:18

#状況
laravel8でReact×TypeScriptのアプリケーションを作成中
認証はlaravel-uiで行っている
laravelでapiを作成して、ログインユーザーの情報をReact側のaxiosで受け取りたい

#解決したいこと
apiの中でAuth:id()でidを取得できない

#ソース
api.php

Route::get('/users', function(Request $request) { $id = Auth::id(); // $id = 4; $users = DB::table('users')->where("users.id",$id)->get(); $users = $request->user(); return response()->json(['users' => $users]); });

User.tsx

import { useEffect, useState, VFC } from 'react'; import axios from 'axios'; type usersType = [ { id: string; name: string; email: string; created_at: string; updated_at: string; email_verified_at: string; } ]; export const User: VFC = () => { const [users, setUsers] = useState<usersType>(); useEffect(() => { getUsers(); }, []); const getUsers = async () => { const response = await axios.get('/api/users'); setUsers(response.data.users); console.log(response.data.users); }; return ( <div> <h1>Userページ</h1> <ul> {users?.map((user) => ( <li key={user.id}>{user.name}</li> ))} </ul> </div> ); };

api.phpのidの部分を手打ちで打つとデータは取れるのでデータの取得自体は出来ている。
Auth::id()でなぜidが取れないのかがわからない。
web.phpの方のブレードファイル内ではAuth:id()で取得することができていた。
#やったこと
ミドルウェアに問題があるとの記事を見つけたのでKernel.phpを変更したが変化なし。

kernel.php

・・・ protected $middlewareGroups = [ 'web' => [ \App\Http\Middleware\EncryptCookies::class, \Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse::class, \Illuminate\Session\Middleware\StartSession::class, \Illuminate\Session\Middleware\AuthenticateSession::class, \Illuminate\View\Middleware\ShareErrorsFromSession::class, \App\Http\Middleware\VerifyCsrfToken::class, \Illuminate\Routing\Middleware\SubstituteBindings::class, \App\Http\Middleware\HandleInertiaRequests::class, ], 'api' => [ 'throttle:api', \App\Http\Middleware\EncryptCookies::class, \Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse::class, \Illuminate\Session\Middleware\StartSession::class, \Illuminate\Session\Middleware\AuthenticateSession::class, \Illuminate\View\Middleware\ShareErrorsFromSession::class, \App\Http\Middleware\VerifyCsrfToken::class, \Illuminate\Routing\Middleware\SubstituteBindings::class, \App\Http\Middleware\HandleInertiaRequests::class, ] ]; ・・・

なぜかコントローラーを作ってやろうとするとデータが取れなくなってしまうため、api.phpにてfunctionを書いています。
また、この方法しか思いつかなかったのですが、他にデータ取得の方法があれば教えてほしいです。
バックエンド自体触るのが初めてで全くわからないので、Auth:id()で取得できない理由を教えていただけると幸いです。

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

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

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

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

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

guest

回答2

0

ベストアンサー

リファレンスの日本語訳から説明を抜粋しますと、、、
https://readouble.com/laravel/8.x/ja/authentication.html

Laravelは、通常AuthもしくはSessionファサードを介してアクセスされる組み込みの認証およびセッションサービスを持っています。これらの機能は、Webブラウザから開始された要求に対してクッキーベースの認証を提供します。

--中略--

リモートサービスがAPIへアクセスするために認証する必要がある場合はWebブラウザがないため、通常クッキーは認証に使用されません。代わりにリモートサービスはリクエストごとにAPIトークンをAPIに送信します。アプリケーションは有効なAPIトークンのテーブルに対して受信したトークンを検証し、そのAPIトークンに関連付けられたユーザーによって実行されたものとしてそのリクエストを「認証」します。

今回使用されているAuthファサードを介した認証機能がありますが、それはブラウザのクッキーの存在が前提になっており、セッションIDがcookieに保持されることで、ユーザーを識別してます。

今回は「laravelでapiを作成」ということですので、上記の認証方法は使えないんじゃないかなと思われます、、><

じゃあどうするかというと、ドキュメントには代わりにAPIトークンを使用しましょう、と記載がありますね^^
LaravelはAPIトークンを用いた認証パッケージではPassportとSanctumを提供していますので、どちらかを選択して実装することになるんじゃないでしょうか ・_・

補足情報

config/auth.phpは認証の設定ファイルになります。

ここでwebはデフォルトでsessionを利用する設定がされています。
https://github.com/laravel/laravel/blob/8.x/config/auth.php

これのおかげで、web.phpの方のブレードファイル内でidを取得できた気が、、? (過去の記憶で動作確認してないので違ったらすみません><)

laravelのversion7.xではapiはtokenとデフォルトで使用するという設定が書かれていますが、8.xではもう記載されてないですね><
https://github.com/laravel/laravel/blob/7.x/config/auth.php

投稿2021/08/24 18:54

編集2021/08/25 02:19
kawa_kawawaka

総合スコア71

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

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

kai0310

2021/08/25 01:25

細かいことですが、ご提示のサイトは公式ドキュメントではありません。
kawa_kawawaka

2021/08/25 02:13

公式リファレンスを日本語訳しているサイトですね。 ご指摘ありがとうございます????‍♂️
it-tsumugi

2021/08/25 03:11

Authファサードの仕組みがわからなくて困っていたので助かりました。クッキーベースだからうまく行かなかったんですね。Sactumを使うとさらに学習量が更に増えそうなので避けていたのですがやってみたいと思います。
kawa_kawawaka

2021/08/25 03:14

お助けになれたようでよかったです!!!^^
guest

0

API使用時に認証の処理が入っていないからではないでしょうか?(少なくともUser.tsxを見る限りでは、その辺の処理が一切入っていないように見えますが・・・)

ざっと調べたところ、最近のLaravelだと、サーバ側ではLaravel Sanctumを利用し、クライアント側ではAPI使用時にトークンを渡すかCookieを使用するのが一般的みたいです(ReactもLaravel8もまともに使ったことないので、間違っていたらすいません)。

参考)
https://readouble.com/laravel/8.x/ja/sanctum.html

https://nochio12.hatenablog.com/entry/2020/10/03/215718

https://reffect.co.jp/laravel/laravel-sanctum-token

投稿2021/08/21 17:34

AbeTakashi

総合スコア4812

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

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

it-tsumugi

2021/08/25 03:07

ありがとうございます。認識がそもそも間違っていたようなのでトークン認証にしようかと思います
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.39%

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

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

質問する

関連した質問