<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Laravel | ばすにっきTips</title>
	<atom:link href="https://takabus.com/tips/category/laravel/feed/" rel="self" type="application/rss+xml" />
	<link>https://takabus.com/tips</link>
	<description>プログラミングやサーバー、日々のTipsをメモしています。</description>
	<lastBuildDate>Sat, 06 Jan 2024 01:02:38 +0000</lastBuildDate>
	<language>ja</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.4.3</generator>

<image>
	<url>https://takabus.com/tips/wp-content/uploads/2022/12/cropped-tips-1-32x32.png</url>
	<title>Laravel | ばすにっきTips</title>
	<link>https://takabus.com/tips</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>「Laravel News」がおもしろい！Laravel開発者におすすめの無料メールマガジン！</title>
		<link>https://takabus.com/tips/243/</link>
					<comments>https://takabus.com/tips/243/#respond</comments>
		
		<dc:creator><![CDATA[ばすにっきTips]]></dc:creator>
		<pubDate>Sun, 16 Oct 2022 11:15:04 +0000</pubDate>
				<category><![CDATA[Laravel]]></category>
		<guid isPermaLink="false">https://takabus.com/tips/?p=243</guid>

					<description><![CDATA[Laravel開発に携わるみなさんにおすすめのメールマガジン「Laravel News」をご紹介します。]]></description>
										<content:encoded><![CDATA[
<p><span class="red">Laravel</span>開発に携わるみなさんに<span class="red">おすすめのメールマガジン「Laravel News」</span>をご紹介します。</p>



<h2 class="wp-block-heading">Laravel公式ニュースレター「Laravel News」</h2>



<p><span class="red">Laravel News</span>は、Laravelが公式に発行しているメールマガジンとウェブサイトです。</p>




<a rel="noopener" href="https://laravel-news.com/" title="Just a moment..." class="blogcard-wrap external-blogcard-wrap a-wrap cf" target="_blank"><div class="blogcard external-blogcard eb-left cf"><div class="blogcard-label external-blogcard-label"><span class="fa"></span></div><figure class="blogcard-thumbnail external-blogcard-thumbnail"><img decoding="async" src="https://s.wordpress.com/mshots/v1/https%3A%2F%2Flaravel-news.com%2F?w=160&#038;h=90" alt="" class="blogcard-thumb-image external-blogcard-thumb-image" width="160" height="90" /></figure><div class="blogcard-content external-blogcard-content"><div class="blogcard-title external-blogcard-title">Just a moment...</div><div class="blogcard-snippet external-blogcard-snippet"></div></div><div class="blogcard-footer external-blogcard-footer cf"><div class="blogcard-site external-blogcard-site"><div class="blogcard-favicon external-blogcard-favicon"><img decoding="async" src="https://www.google.com/s2/favicons?domain=https://laravel-news.com/" alt="" class="blogcard-favicon-image external-blogcard-favicon-image" width="16" height="16" /></div><div class="blogcard-domain external-blogcard-domain">laravel-news.com</div></div></div></div></a>



<p>毎週日曜日に発行されており、その週にあったLaravelに関するアツいニュースをまとめて紹介してくれています。</p>



<div class="wp-block-cocoon-blocks-balloon-ex-box-1 speech-wrap sb-id-1 sbs-stn sbp-l sbis-cb cf block-box"><div class="speech-person"><figure class="speech-icon"><img decoding="async" src="https://takabus.com/tips/wp-content/uploads/2021/09/man.png" alt="" class="speech-icon-image"/></figure><div class="speech-name"></div></div><div class="speech-balloon">
<p>公式ツイッターもあります！</p>




<a rel="noopener" href="https://twitter.com/laravelnews?s=20&#038;t=uBUmc6OTdpBONiCl69Cywg" title="Laravel News (@laravelnews) on X" class="blogcard-wrap external-blogcard-wrap a-wrap cf" target="_blank"><div class="blogcard external-blogcard eb-left cf"><div class="blogcard-label external-blogcard-label"><span class="fa"></span></div><figure class="blogcard-thumbnail external-blogcard-thumbnail"><img decoding="async" src="https://pbs.twimg.com/profile_images/1359866716222861317/coQ-RmRS_200x200.jpg" alt="" class="blogcard-thumb-image external-blogcard-thumb-image" width="160" height="90" /></figure><div class="blogcard-content external-blogcard-content"><div class="blogcard-title external-blogcard-title">Laravel News (@laravelnews) on X</div><div class="blogcard-snippet external-blogcard-snippet">Your news source for the Laravel PHP Framework. Email us at hello@laravel-news.com</div></div><div class="blogcard-footer external-blogcard-footer cf"><div class="blogcard-site external-blogcard-site"><div class="blogcard-favicon external-blogcard-favicon"><img loading="lazy" decoding="async" src="https://www.google.com/s2/favicons?domain=https://x.com/laravelnews?s=20&#038;t=uBUmc6OTdpBONiCl69Cywg" alt="" class="blogcard-favicon-image external-blogcard-favicon-image" width="16" height="16" /></div><div class="blogcard-domain external-blogcard-domain">x.com</div></div></div></div></a>
</div></div>



<p>大きなアップデートがあったときはもちろん、便利なライブラリやツールについてもたくさんの特集が組まれています。サンプルコードとともにわかりやすく解説してくれており、大変勉強になります。</p>



<p>もちろん<span class="red">誰でも無料</span>で登録できますので、Laravel開発者の方はぜひ登録しておくといいですよ♪</p>



<h2 class="wp-block-heading">Laravel Newsの登録方法</h2>



<p>Laravel Newsへの登録は下記の<span class="red">登録ページ</span>から行うことができます。</p>




<a rel="noopener" href="https://laravel-news.com/newsletter" title="Just a moment..." class="blogcard-wrap external-blogcard-wrap a-wrap cf" target="_blank"><div class="blogcard external-blogcard eb-left cf"><div class="blogcard-label external-blogcard-label"><span class="fa"></span></div><figure class="blogcard-thumbnail external-blogcard-thumbnail"><img loading="lazy" decoding="async" src="https://s.wordpress.com/mshots/v1/https%3A%2F%2Flaravel-news.com%2Fnewsletter?w=160&#038;h=90" alt="" class="blogcard-thumb-image external-blogcard-thumb-image" width="160" height="90" /></figure><div class="blogcard-content external-blogcard-content"><div class="blogcard-title external-blogcard-title">Just a moment...</div><div class="blogcard-snippet external-blogcard-snippet"></div></div><div class="blogcard-footer external-blogcard-footer cf"><div class="blogcard-site external-blogcard-site"><div class="blogcard-favicon external-blogcard-favicon"><img loading="lazy" decoding="async" src="https://www.google.com/s2/favicons?domain=https://laravel-news.com/newsletter" alt="" class="blogcard-favicon-image external-blogcard-favicon-image" width="16" height="16" /></div><div class="blogcard-domain external-blogcard-domain">laravel-news.com</div></div></div></div></a>



<p>もしくはLaravel News公式サイトのフッターから直接登録することもできます。</p>



<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="620" height="305" src="https://takabus.com/tips/wp-content/uploads/2022/10/image-2.png" alt="" class="wp-image-2134" srcset="https://takabus.com/tips/wp-content/uploads/2022/10/image-2.png 620w, https://takabus.com/tips/wp-content/uploads/2022/10/image-2-300x148.png 300w" sizes="(max-width: 620px) 100vw, 620px" /></figure>



<p>hello@laravel-news.comにメールを送ることでもできるようです。</p>



<h2 class="wp-block-heading">ところで・・・</h2>



<p>ところで、ひとつギモンだったことが。</p>



<p><mark style="background-color:rgba(0, 0, 0, 0)" class="has-inline-color has-deep-orange-color">「Laravel Newsは何で作られているのかなー」</mark></p>



<p>調べてみたら、<span class="red">Laravel News自体もLaravelで制作されているようです。</span></p>



<p>そりゃそうだよね（^^;）</p>



<h2 class="wp-block-heading">まとめ</h2>



<p>知っての通り、Webの技術は日進月歩です。Laravel Newsにまだ登録していない方は、ぜひ登録してup to dateなLaravel Developerになりましょう！</p>
]]></content:encoded>
					
					<wfw:commentRss>https://takabus.com/tips/243/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>【nuxt/authｘLaravel SanctumでSPA認証】サンプルを公開しました</title>
		<link>https://takabus.com/tips/1826/</link>
					<comments>https://takabus.com/tips/1826/#respond</comments>
		
		<dc:creator><![CDATA[ばすにっきTips]]></dc:creator>
		<pubDate>Sat, 10 Sep 2022 11:34:58 +0000</pubDate>
				<category><![CDATA[Laravel]]></category>
		<category><![CDATA[Nuxt.js]]></category>
		<category><![CDATA[Laravel Sanctum]]></category>
		<guid isPermaLink="false">https://takabus.com/tips/?p=1826</guid>

					<description><![CDATA[GitHubにNuxtJS（nuxt/auth）とLaravel Sanctumのサンプルプロジェクトを公開しました。Laravel Sanctumとnuxt/authによるSPA認証をすぐに体験できます。]]></description>
										<content:encoded><![CDATA[
<p>GitHubにNuxtJS（nuxt/auth）とLaravel Sanctumのサンプルプロジェクトを公開しました。Laravel Sanctumとnuxt/authによるSPA認証をすぐに体験できます。</p>



<figure class="wp-block-video"><video autoplay loop src="https://takabus.com/tips/wp-content/uploads/2022/09/CLIP_20220911_192226.mp4"></video></figure>




<a rel="noopener" href="https://github.com/takabus/laravel-sanctum-nuxt-auth-sample" title="GitHub - takabus/laravel-sanctum-nuxt-auth-sample: SPA authorization sample with Laravel Sanctum and NuxtJS official auth module." class="blogcard-wrap external-blogcard-wrap a-wrap cf" target="_blank"><div class="blogcard external-blogcard eb-left cf"><div class="blogcard-label external-blogcard-label"><span class="fa"></span></div><figure class="blogcard-thumbnail external-blogcard-thumbnail"><img loading="lazy" decoding="async" src="https://opengraph.githubassets.com/d21366e94ddb9f79d969d63bd8ecae850a3bc73cdaa684917fbbf24396fecd49/takabus/laravel-sanctum-nuxt-auth-sample" alt="" class="blogcard-thumb-image external-blogcard-thumb-image" width="160" height="90" /></figure><div class="blogcard-content external-blogcard-content"><div class="blogcard-title external-blogcard-title">GitHub - takabus/laravel-sanctum-nuxt-auth-sample: SPA authorization sample with Laravel Sanctum and NuxtJS official auth module.</div><div class="blogcard-snippet external-blogcard-snippet">SPA authorization sample with Laravel Sanctum and NuxtJS official auth module. - takabus/laravel-sanctum-nuxt-auth-sampl...</div></div><div class="blogcard-footer external-blogcard-footer cf"><div class="blogcard-site external-blogcard-site"><div class="blogcard-favicon external-blogcard-favicon"><img loading="lazy" decoding="async" src="https://www.google.com/s2/favicons?domain=https://github.com/takabus/laravel-sanctum-nuxt-auth-sample" alt="" class="blogcard-favicon-image external-blogcard-favicon-image" width="16" height="16" /></div><div class="blogcard-domain external-blogcard-domain">github.com</div></div></div></div></a>



<p>Laravel SanctumとNuxtJSによるSPA認証については、以前チュートリアル記事をアップしていますので、ご活用ください。</p>



<figure class="wp-block-embed is-type-wp-embed is-provider-ばすにっきtips wp-block-embed-ばすにっきtips"><div class="wp-block-embed__wrapper">

<a href="https://takabus.com/tips/940/" title="Laravelとnuxt/authでSPA認証！ログイン機能を実装しよう！（第1回 バックエンド編）" class="blogcard-wrap internal-blogcard-wrap a-wrap cf"><div class="blogcard internal-blogcard ib-left cf"><div class="blogcard-label internal-blogcard-label"><span class="fa"></span></div><figure class="blogcard-thumbnail internal-blogcard-thumbnail"><img loading="lazy" decoding="async" width="160" height="90" src="https://takabus.com/tips/wp-content/uploads/2022/07/laravelsanctum-nuxt-spa-160x90.png" class="blogcard-thumb-image internal-blogcard-thumb-image wp-post-image" alt="" srcset="https://takabus.com/tips/wp-content/uploads/2022/07/laravelsanctum-nuxt-spa-160x90.png 160w, https://takabus.com/tips/wp-content/uploads/2022/07/laravelsanctum-nuxt-spa-300x169.png 300w, https://takabus.com/tips/wp-content/uploads/2022/07/laravelsanctum-nuxt-spa-1024x576.png 1024w, https://takabus.com/tips/wp-content/uploads/2022/07/laravelsanctum-nuxt-spa-768x432.png 768w, https://takabus.com/tips/wp-content/uploads/2022/07/laravelsanctum-nuxt-spa-1536x864.png 1536w, https://takabus.com/tips/wp-content/uploads/2022/07/laravelsanctum-nuxt-spa-120x68.png 120w, https://takabus.com/tips/wp-content/uploads/2022/07/laravelsanctum-nuxt-spa-320x180.png 320w, https://takabus.com/tips/wp-content/uploads/2022/07/laravelsanctum-nuxt-spa-374x210.png 374w, https://takabus.com/tips/wp-content/uploads/2022/07/laravelsanctum-nuxt-spa.png 1920w" sizes="(max-width: 160px) 100vw, 160px" /></figure><div class="blogcard-content internal-blogcard-content"><div class="blogcard-title internal-blogcard-title">Laravelとnuxt/authでSPA認証！ログイン機能を実装しよう！（第1回 バックエンド編）</div><div class="blogcard-snippet internal-blogcard-snippet">Laravel とフロントエンドフレームワーク「Nuxt.js」を使い、SPA認証（ログイン機能）をできるだけ簡単に実装する方法を紹介していきます。第1回はLaravel Sanctumを使ったSPA認証対応のバックエンド構築の手順について紹介していきます。</div></div><div class="blogcard-footer internal-blogcard-footer cf"><div class="blogcard-site internal-blogcard-site"><div class="blogcard-favicon internal-blogcard-favicon"><img loading="lazy" decoding="async" src="https://www.google.com/s2/favicons?domain=https://takabus.com/tips" alt="" class="blogcard-favicon-image internal-blogcard-favicon-image" width="16" height="16" /></div><div class="blogcard-domain internal-blogcard-domain">takabus.com</div></div><div class="blogcard-date internal-blogcard-date"><div class="blogcard-post-date internal-blogcard-post-date">2022.04.18</div></div></div></div></a>
</div></figure>



<figure class="wp-block-embed is-type-wp-embed is-provider-ばすにっきtips wp-block-embed-ばすにっきtips"><div class="wp-block-embed__wrapper">

<a href="https://takabus.com/tips/1396/" title="Laravelとnuxt/authでSPA認証！ログイン機能を実装しよう！（第2回 フロントエンド編）" class="blogcard-wrap internal-blogcard-wrap a-wrap cf"><div class="blogcard internal-blogcard ib-left cf"><div class="blogcard-label internal-blogcard-label"><span class="fa"></span></div><figure class="blogcard-thumbnail internal-blogcard-thumbnail"><img loading="lazy" decoding="async" width="160" height="90" src="https://takabus.com/tips/wp-content/uploads/2022/07/laravelsanctum-nuxt-spa-160x90.png" class="blogcard-thumb-image internal-blogcard-thumb-image wp-post-image" alt="" srcset="https://takabus.com/tips/wp-content/uploads/2022/07/laravelsanctum-nuxt-spa-160x90.png 160w, https://takabus.com/tips/wp-content/uploads/2022/07/laravelsanctum-nuxt-spa-300x169.png 300w, https://takabus.com/tips/wp-content/uploads/2022/07/laravelsanctum-nuxt-spa-1024x576.png 1024w, https://takabus.com/tips/wp-content/uploads/2022/07/laravelsanctum-nuxt-spa-768x432.png 768w, https://takabus.com/tips/wp-content/uploads/2022/07/laravelsanctum-nuxt-spa-1536x864.png 1536w, https://takabus.com/tips/wp-content/uploads/2022/07/laravelsanctum-nuxt-spa-120x68.png 120w, https://takabus.com/tips/wp-content/uploads/2022/07/laravelsanctum-nuxt-spa-320x180.png 320w, https://takabus.com/tips/wp-content/uploads/2022/07/laravelsanctum-nuxt-spa-374x210.png 374w, https://takabus.com/tips/wp-content/uploads/2022/07/laravelsanctum-nuxt-spa.png 1920w" sizes="(max-width: 160px) 100vw, 160px" /></figure><div class="blogcard-content internal-blogcard-content"><div class="blogcard-title internal-blogcard-title">Laravelとnuxt/authでSPA認証！ログイン機能を実装しよう！（第2回 フロントエンド編）</div><div class="blogcard-snippet internal-blogcard-snippet">Laravel とフロントエンドフレームワーク「Nuxt.js」を使い、SPA認証（ログイン機能）をできるだけかんたんに実装する方法を紹介していきます。</div></div><div class="blogcard-footer internal-blogcard-footer cf"><div class="blogcard-site internal-blogcard-site"><div class="blogcard-favicon internal-blogcard-favicon"><img loading="lazy" decoding="async" src="https://www.google.com/s2/favicons?domain=https://takabus.com/tips" alt="" class="blogcard-favicon-image internal-blogcard-favicon-image" width="16" height="16" /></div><div class="blogcard-domain internal-blogcard-domain">takabus.com</div></div><div class="blogcard-date internal-blogcard-date"><div class="blogcard-post-date internal-blogcard-post-date">2022.07.29</div></div></div></div></a>
</div></figure>



<h2 class="wp-block-heading">クローンする</h2>



<p>まずはGitHubからクローンしてください。</p>



<pre class="wp-block-code"><code>git clone https://github.com/takabus/laravel-sanctum-nuxt-auth-sample.git</code></pre>



<h2 class="wp-block-heading">インストール（フロントエンド）</h2>



<p>必要なライブラリをインストールします。</p>



<p>frontディレクトリでコンソールを起動し、npm installを実行します。</p>



<pre class="wp-block-code"><code>cd front
# フロントエンド（NuxtJS）の依存ライブラリをインストール
npm install</code></pre>



<h2 class="wp-block-heading">インストール（バックエンド）</h2>



<p>backディレクトリに移動し、composer installを実行します。</p>



<pre class="wp-block-code"><code>cd back
# バックエンド（Laravel）の依存ライブラリをインストール
composer install</code></pre>



<p>.env.exampleファイルをコピーして、.envファイルを作成します。</p>



<pre class="wp-block-code"><code>cp .env.example .env</code></pre>



<p>.env.exampleにはLaravel Sanctumの動作に必要な変数やテストユーザーを含むSQLiteデータベースへの接続設定が含まれています。詳しくはコメントをご確認ください。</p>



<p>APP_KEYを生成します。</p>



<pre class="wp-block-code"><code>php artisan key:generate</code></pre>



<p>以上でセットアップは完了です。</p>



<h2 class="wp-block-heading">さわってみよう</h2>



<p>Windowsの場合はstart.batを実行すると、バック・フロントエンドの開発サーバーが起動します。</p>



<p>ブラウザでフロントエンドの開発サーバー（http://localhost:3000/）にアクセスすると、SPA認証をお試しいただけます。</p>



<p>あらかじめテストユーザー（ID：t@localhost パスワード：password）を登録してありますので、ログインしてみてください。</p>



<figure class="wp-block-video"><video autoplay loop src="https://takabus.com/tips/wp-content/uploads/2022/09/CLIP_20220911_192226.mp4"></video></figure>
]]></content:encoded>
					
					<wfw:commentRss>https://takabus.com/tips/1826/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		<enclosure url="https://takabus.com/tips/wp-content/uploads/2022/09/CLIP_20220911_192226.mp4" length="522806" type="video/mp4" />

			</item>
		<item>
		<title>【Laravel】ログインされたときに任意の処理を実行するには？</title>
		<link>https://takabus.com/tips/1814/</link>
					<comments>https://takabus.com/tips/1814/#respond</comments>
		
		<dc:creator><![CDATA[ばすにっきTips]]></dc:creator>
		<pubDate>Sat, 10 Sep 2022 03:10:01 +0000</pubDate>
				<category><![CDATA[Laravel]]></category>
		<guid isPermaLink="false">https://takabus.com/tips/?p=1814</guid>

					<description><![CDATA[ログインされたときやログインに失敗したときに任意の処理を実行する方法を紹介します。ショートメッセージやメールでログインを通知したり、ログを残したりすることができます。]]></description>
										<content:encoded><![CDATA[
<p>ログインされたときやログインに失敗したときに任意の処理を実行する方法を紹介します。ショートメッセージやメールでログインを通知したり、ログを残したりすることができます。</p>



<div class="wp-block-cocoon-blocks-icon-box common-icon-box block-box information-box">
<p>Laravel 6での方法を紹介します。</p>
</div>



<h2 class="wp-block-heading">イベントを活用しよう</h2>



<p>Laravelにはイベントという機能が搭載されています。</p>



<p>イベントを活用することにより、ログインやログアウトなどといった特定の処理が発生したときに任意のプログラムを実行することができるようになります。</p>



<p><strong>イベントリスナ（イベントが発生したときに行う処理を定義しておくファイル）</strong>をあらかじめ作成しておくことで、ログインされたときに任意の処理を実行できます。</p>



<h2 class="wp-block-heading">イベントを作成する</h2>



<p>まずは、<code>app\Providers\EventServiceProvider.php</code>を開き、イベントハンドラを定義します。</p>



<p>ここではAuthで利用できるすべてのイベントを定義してみます。</p>



<pre class="wp-block-code"><code>/**
 * アプリケーションに指定されたイベントリスナ
 *
 * @var array
 */
protected $listen = &#91;
   <strong> 'Illuminate\Auth\Events\Registered' =&gt; &#91;
        'App\Listeners\LogRegisteredUser',
    ],

    'Illuminate\Auth\Events\Attempting' =&gt; &#91;
        'App\Listeners\LogAuthenticationAttempt',
    ],

    'Illuminate\Auth\Events\Authenticated' =&gt; &#91;
        'App\Listeners\LogAuthenticated',
    ],

    'Illuminate\Auth\Events\Login' =&gt; &#91;
        'App\Listeners\LogSuccessfulLogin',
    ],

    'Illuminate\Auth\Events\Failed' =&gt; &#91;
        'App\Listeners\LogFailedLogin',
    ],

    'Illuminate\Auth\Events\Logout' =&gt; &#91;
        'App\Listeners\LogSuccessfulLogout',
    ],

    'Illuminate\Auth\Events\Lockout' =&gt; &#91;
        'App\Listeners\LogLockout',
    ],

    'Illuminate\Auth\Events\PasswordReset' =&gt; &#91;
        'App\Listeners\LogPasswordReset',
    ],</strong>
];</code></pre>



<p>認証に関するイベントの種類についてはこちらの表のようになります。</p>



<figure class="wp-block-table"><table><thead><tr><th>イベント</th><th>実行されるタイミング</th></tr></thead><tbody><tr><td>&nbsp;Illuminate\Auth\Events\Registered</td><td>ユーザーが登録されたとき</td></tr><tr><td>&nbsp;Illuminate\Auth\Events\Attempting</td><td>認証が行われたとき</td></tr><tr><td>&nbsp;Illuminate\Auth\Events\Authenticated</td><td>認証が成功したとき<br>（ログインページでログイン成功したとき＋ログイン済みで自動的に認証されたときも発火）</td></tr><tr><td>&nbsp;Illuminate\Auth\Events\Login</td><td>ログインされたとき<br>（ログインページでログイン成功したときのみ発火）</td></tr><tr><td>&nbsp;Illuminate\Auth\Events\Failed</td><td>ログインに失敗したとき</td></tr><tr><td>&nbsp;Illuminate\Auth\Events\Logout</td><td>ログアウトされたとき</td></tr><tr><td>&nbsp;Illuminate\Auth\Events\PasswordReset</td><td>パスワードリセットが行われたとき</td></tr></tbody></table><figcaption>Laravel 認証イベントの種類</figcaption></figure>



<p>例えば、下のようにしておくと、ユーザーが登録されたとき（<code>Illuminate\Auth\Events\Registered</code>）にイベントが発火し、イベントリスナ（<code>App\Listeners\LogRegisteredUser</code>）が実行されます。</p>



<pre class="wp-block-code"><code>   <strong> 'Illuminate\Auth\Events\Registered' =&gt; &#91;
        'App\Listeners\LogRegisteredUser',
    ],</strong></code></pre>



<p>同様に、ログインされたときに処理を行いたいときは<strong>Illuminate\Auth\Events\Login</strong>イベントを定義してやればOKです。イベントの種類は<a href="https://readouble.com/laravel/6.x/ja/authentication.html">Laravelのドキュメント</a>に記載されています。</p>



<p>なお、実行されるイベントリスナのファイルは次の手順で自動生成させますので、手動で作成する必要はありません。</p>



<h2 class="wp-block-heading">イベントリスナを作成する</h2>



<p>上記のファイルで定義したイベントリスナを作成します。artisanコマンドで作成できます。</p>



<pre class="wp-block-code"><code>php artisan event:generate</code></pre>



<p><code>App\Listeners</code>ディレクトリが作成され、<code>EventServiceProvider.php</code>で定義したイベントリスナが作成されます。</p>



<div class="wp-block-cocoon-blocks-balloon-ex-box-1 speech-wrap sb-id-1 sbs-stn sbp-l sbis-cb cf block-box"><div class="speech-person"><figure class="speech-icon"><img decoding="async" src="https://takabus.com/tips/wp-content/uploads/2021/09/man.png" alt="" class="speech-icon-image"/></figure><div class="speech-name"></div></div><div class="speech-balloon">
<p>後からイベントを追加した場合も同様にコマンドを実行します。</p>



<p>存在しないイベントリスナが自動的に追加されます。</p>
</div></div>



<h2 class="wp-block-heading">処理を実装する</h2>



<p><code>App\Listeners</code>ディレクトリに作成されたファイル群を編集することで、実行したい処理を実装することができます。</p>



<p>ここでは、<code>app\Listeners\LogSuccessfulLogin.php</code>に処理を追加し、ログインに成功したときにログに記録するようにしてみます。</p>



<pre class="wp-block-code"><code>&lt;?php

namespace App\Listeners;

use App\Http\Controllers\LineNotifyCon;
use Illuminate\Auth\Events\Login;
use Illuminate\Support\Facades\Log;

class LogSuccessfulLogin
{
    /**
     * Create the event listener.
     *
     * @return void
     */
    public function __construct()
    {
        //
    }

    /**
     * Handle the event.
     *
     * @param  Login  $event
     * @return void
     */
    public function handle(Login $event)
    {

        //ログインされたらログ(storage/log/laravel.log)に残す
        Log::info("Login");
        Log::info($event-&gt;user);
    }
}
</code></pre>



<p>これでログインされたときに自動的にログが記録されるようになりました。</p>



<h2 class="wp-block-heading">まとめ</h2>



<p>ログインされたときに任意の処理を実行する方法を紹介しました。</p>



<p>Laravelでは便利な数多くのイベントが用意されていますので、目的にあったイベントを活用しましょう。</p>
]]></content:encoded>
					
					<wfw:commentRss>https://takabus.com/tips/1814/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>【Laravel Sanctum】ステートフルドメインを全許可に設定するには？</title>
		<link>https://takabus.com/tips/1153/</link>
					<comments>https://takabus.com/tips/1153/#respond</comments>
		
		<dc:creator><![CDATA[ばすにっきTips]]></dc:creator>
		<pubDate>Thu, 01 Sep 2022 10:16:47 +0000</pubDate>
				<category><![CDATA[Laravel]]></category>
		<guid isPermaLink="false">https://takabus.com/tips/?p=1153</guid>

					<description><![CDATA[Laravel Sanctamでステートフルドメイン（SANCTUM_STATEFUL_DOMAINS）の判定を一時的に止め、すべて許可する方法を紹介します。 ステートフルドメインの判定を止めるには？ vendor\la [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p>Laravel Sanctamでステートフルドメイン（SANCTUM_STATEFUL_DOMAINS）の判定を一時的に止め、すべて許可する方法を紹介します。</p>



<h2 class="wp-block-heading" id="ステートフルドメインの判定を止めるには">ステートフルドメインの判定を止めるには？</h2>



<p>vendor\laravel\sanctum\src\Http\Middleware\EnsureFrontendRequestsAreStateful.phpを編集します。</p>



<p>fromFrontend関数がつねにtrueを返すようにします。</p>



<pre class="wp-block-code"><code>    /**
     * Determine if the given request is from the first-party application frontend.
     *
     * @param  \Illuminate\Http\Request  $request
     * @return bool
     */
    public static function fromFrontend($request)
    {
        $domain = $request-&gt;headers-&gt;get('referer') ?: $request-&gt;headers-&gt;get('origin');

        if (is_null($domain)) {
            return false;
        }

        $domain = Str::replaceFirst('https://', '', $domain);
        $domain = Str::replaceFirst('http://', '', $domain);
        $domain = Str::endsWith($domain, '/') ? $domain : "{$domain}/";

        $stateful = array_filter(config('sanctum.stateful', &#91;]));

        <strong>return true;//つねにtrueを返すと全許可になる</strong>
        return Str::is(Collection::make($stateful)-&gt;map(function ($uri) {
            return trim($uri).'/*';
        })-&gt;all(), $domain);
    }</code></pre>



<p>もちろん、姑息的な方法ですので、最終的にはSANCTUM_STATEFUL_DOMAINSを適切に設定する必要があります。</p>
]]></content:encoded>
					
					<wfw:commentRss>https://takabus.com/tips/1153/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Laravelとnuxt/authでSPA認証！ログイン機能を実装しよう！（第2回 フロントエンド編）</title>
		<link>https://takabus.com/tips/1396/</link>
					<comments>https://takabus.com/tips/1396/#respond</comments>
		
		<dc:creator><![CDATA[ばすにっきTips]]></dc:creator>
		<pubDate>Fri, 29 Jul 2022 04:36:21 +0000</pubDate>
				<category><![CDATA[Laravel]]></category>
		<category><![CDATA[Nuxt.js]]></category>
		<category><![CDATA[Laravel Sanctum]]></category>
		<guid isPermaLink="false">https://takabus.com/tips/?p=1396</guid>

					<description><![CDATA[Laravel とフロントエンドフレームワーク「Nuxt.js」を使い、SPA認証（ログイン機能）をできるだけかんたんに実装する方法を紹介していきます。]]></description>
										<content:encoded><![CDATA[
<p>前回はLaravel Sanctumをインストールし、バックエンド側のAPI認証を実装しました。第2回ではnuxt/authを使用し、NuxtJSで構築したフロントエンドにログイン機能を実装していきます。</p>



<div class="wp-block-cocoon-blocks-blogcard blogcard-type bct-prev">

<a href="https://takabus.com/tips/940/" title="Laravelとnuxt/authでSPA認証！ログイン機能を実装しよう！（第1回 バックエンド編）" class="blogcard-wrap internal-blogcard-wrap a-wrap cf"><div class="blogcard internal-blogcard ib-left cf"><div class="blogcard-label internal-blogcard-label"><span class="fa"></span></div><figure class="blogcard-thumbnail internal-blogcard-thumbnail"><img loading="lazy" decoding="async" width="160" height="90" src="https://takabus.com/tips/wp-content/uploads/2022/07/laravelsanctum-nuxt-spa-160x90.png" class="blogcard-thumb-image internal-blogcard-thumb-image wp-post-image" alt="" srcset="https://takabus.com/tips/wp-content/uploads/2022/07/laravelsanctum-nuxt-spa-160x90.png 160w, https://takabus.com/tips/wp-content/uploads/2022/07/laravelsanctum-nuxt-spa-300x169.png 300w, https://takabus.com/tips/wp-content/uploads/2022/07/laravelsanctum-nuxt-spa-1024x576.png 1024w, https://takabus.com/tips/wp-content/uploads/2022/07/laravelsanctum-nuxt-spa-768x432.png 768w, https://takabus.com/tips/wp-content/uploads/2022/07/laravelsanctum-nuxt-spa-1536x864.png 1536w, https://takabus.com/tips/wp-content/uploads/2022/07/laravelsanctum-nuxt-spa-120x68.png 120w, https://takabus.com/tips/wp-content/uploads/2022/07/laravelsanctum-nuxt-spa-320x180.png 320w, https://takabus.com/tips/wp-content/uploads/2022/07/laravelsanctum-nuxt-spa-374x210.png 374w, https://takabus.com/tips/wp-content/uploads/2022/07/laravelsanctum-nuxt-spa.png 1920w" sizes="(max-width: 160px) 100vw, 160px" /></figure><div class="blogcard-content internal-blogcard-content"><div class="blogcard-title internal-blogcard-title">Laravelとnuxt/authでSPA認証！ログイン機能を実装しよう！（第1回 バックエンド編）</div><div class="blogcard-snippet internal-blogcard-snippet">Laravel とフロントエンドフレームワーク「Nuxt.js」を使い、SPA認証（ログイン機能）をできるだけ簡単に実装する方法を紹介していきます。第1回はLaravel Sanctumを使ったSPA認証対応のバックエンド構築の手順について紹介していきます。</div></div><div class="blogcard-footer internal-blogcard-footer cf"><div class="blogcard-site internal-blogcard-site"><div class="blogcard-favicon internal-blogcard-favicon"><img loading="lazy" decoding="async" src="https://www.google.com/s2/favicons?domain=https://takabus.com/tips" alt="" class="blogcard-favicon-image internal-blogcard-favicon-image" width="16" height="16" /></div><div class="blogcard-domain internal-blogcard-domain">takabus.com</div></div><div class="blogcard-date internal-blogcard-date"><div class="blogcard-post-date internal-blogcard-post-date">2022.04.18</div></div></div></div></a>
</div>



<div class="wp-block-cocoon-blocks-tab-box-1 blank-box bb-tab bb-pickup block-box has-border-color has-green-border-color">
<ul id="block-14c748bc-4402-4f8d-b7d3-ade67c6657b5"><li>第1回 バックエンド（Laravel Sanctum）編 <a href="https://takabus.com/tips/940/">https://takabus.com/tips/940/</a></li><li>第2回 フロントエンド（nuxt/auth）編 <a href="https://takabus.com/tips/1396/">https://takabus.com/tips/1396/</a>（←今回）</li></ul>
</div>



<div class="wp-block-cocoon-blocks-balloon-ex-box-1 speech-wrap sb-id-1 sbs-stn sbp-l sbis-cb cf block-box"><div class="speech-person"><figure class="speech-icon"><img decoding="async" src="https://takabus.com/tips/wp-content/uploads/2021/09/man.png" alt="" class="speech-icon-image"/></figure><div class="speech-name"></div></div><div class="speech-balloon">
<p>GitHubにサンプルを公開していますので、ぜひご活用ください。</p>



<figure class="wp-block-embed is-type-wp-embed is-provider-ばすにっきtips wp-block-embed-ばすにっきtips"><div class="wp-block-embed__wrapper">

<a href="https://takabus.com/tips/1826/" title="【nuxt/authｘLaravel SanctumでSPA認証】サンプルを公開しました" class="blogcard-wrap internal-blogcard-wrap a-wrap cf"><div class="blogcard internal-blogcard ib-left cf"><div class="blogcard-label internal-blogcard-label"><span class="fa"></span></div><figure class="blogcard-thumbnail internal-blogcard-thumbnail"><img loading="lazy" decoding="async" width="160" height="90" src="https://takabus.com/tips/wp-content/uploads/2022/07/laravelsanctum-nuxt-spa-160x90.png" class="blogcard-thumb-image internal-blogcard-thumb-image wp-post-image" alt="" srcset="https://takabus.com/tips/wp-content/uploads/2022/07/laravelsanctum-nuxt-spa-160x90.png 160w, https://takabus.com/tips/wp-content/uploads/2022/07/laravelsanctum-nuxt-spa-300x169.png 300w, https://takabus.com/tips/wp-content/uploads/2022/07/laravelsanctum-nuxt-spa-1024x576.png 1024w, https://takabus.com/tips/wp-content/uploads/2022/07/laravelsanctum-nuxt-spa-768x432.png 768w, https://takabus.com/tips/wp-content/uploads/2022/07/laravelsanctum-nuxt-spa-1536x864.png 1536w, https://takabus.com/tips/wp-content/uploads/2022/07/laravelsanctum-nuxt-spa-120x68.png 120w, https://takabus.com/tips/wp-content/uploads/2022/07/laravelsanctum-nuxt-spa-320x180.png 320w, https://takabus.com/tips/wp-content/uploads/2022/07/laravelsanctum-nuxt-spa-374x210.png 374w, https://takabus.com/tips/wp-content/uploads/2022/07/laravelsanctum-nuxt-spa.png 1920w" sizes="(max-width: 160px) 100vw, 160px" /></figure><div class="blogcard-content internal-blogcard-content"><div class="blogcard-title internal-blogcard-title">【nuxt/authｘLaravel SanctumでSPA認証】サンプルを公開しました</div><div class="blogcard-snippet internal-blogcard-snippet">GitHubにNuxtJS（nuxt/auth）とLaravel Sanctumのサンプルプロジェクトを公開しました。Laravel Sanctumとnuxt/authによるSPA認証をすぐに体験できます。Laravel SanctumとNuxtJSによるSPA認証については、以前チュートリアル記事をアップしていますので、ご活用ください。</div></div><div class="blogcard-footer internal-blogcard-footer cf"><div class="blogcard-site internal-blogcard-site"><div class="blogcard-favicon internal-blogcard-favicon"><img loading="lazy" decoding="async" src="https://www.google.com/s2/favicons?domain=https://takabus.com/tips" alt="" class="blogcard-favicon-image internal-blogcard-favicon-image" width="16" height="16" /></div><div class="blogcard-domain internal-blogcard-domain">takabus.com</div></div><div class="blogcard-date internal-blogcard-date"><div class="blogcard-post-date internal-blogcard-post-date">2022.09.10</div></div></div></div></a>
</div></figure>



<p>Laravel SanctumとNuxt/AuthによるSPA認証を体験いただくことができます。</p>



<p>(2022/9/11追記)</p>
</div></div>



<h2 class="wp-block-heading">nuxt/authのインストール</h2>



<p>まずは、nuxt.jsプロジェクトにnuxt/authをインストールしましょう。</p>



<pre class="wp-block-code"><code>npm install --save-exact @nuxtjs/auth-next</code></pre>



<p>nuxt/authは、Nuxt.jsのプロジェクトに認証に関する処理をかんたんに実装することができるモジュールです。第1回で構築したLaravel Sanctumだけではなく、OAuthやLaravel JWT、Laravel Passportなどのさまざまな認証バックエンドと連携させることができます。</p>



<div class="wp-block-cocoon-blocks-tab-box-1 blank-box bb-tab bb-comment block-box">
<p>既存のNuxt.jsプロジェクトに認証機能を追加したい場合は、上記コマンドでnuxt/authをインストールします。まだプロジェクトを作成していない場合は、次のコマンドでNuxtプロジェクトを作成してからインストールしましょう。</p>



<pre class="wp-block-code"><code>npm init nuxt-app &lt;project-name&gt;</code></pre>



<p>いくつかオプションを問われますが、わからないときはすべてNoneを選択しておけば問題ありません。</p>
</div>



<p>APIとの通信に使用するため、nuxt/axiosもインストールしておきましょう。</p>



<pre class="wp-block-code"><code>npm install @nuxtjs/axios</code></pre>



<p>nuxt.config.jsを編集し、nuxt/authとnuxt/axiosをモジュールに追加します。</p>



<pre class="wp-block-code"><code>{
  modules: &#91;
<strong>    '@nuxtjs/axios',
    '@nuxtjs/auth-next'</strong>
  ],
  <strong>auth: {

  }</strong>
}</code></pre>



<p>ついでにauthセクションも追加しておきました。あとで使います。</p>



<h2 class="wp-block-heading">nuxt/authのセットアップ</h2>



<p>次に、nuxt/authのセットアップを行っていきます。Laravel Sanctumで構築したバックエンドにログインし、保護されたルートにアクセスできるようにしていきます。</p>



<h3 class="wp-block-heading">ストラテジー（strategy）を作成する</h3>



<p>nuxt/authでは、認証に関わる設定を<strong>ストラテジー(strategy)</strong>として設定していきます。</p>



<p>ストラテジーは同時に複数定義することができます。例えば、APIサーバーのほか、OAuthを用いた連携ログインも可能にするなど、複数のログイン方法を用意することも可能となっています。</p>



<p>ここではシンプルに第1回で構築したバックエンド（Laravel Sanctum）にログインするためのストラテジーだけを作成していきます。</p>



<p>nuxt.config.jsのauthセクションにstrategiesというセクションを追加し、任意の名前のストラテジーを作成します。</p>



<pre class="wp-block-code"><code>    auth: {
       <strong> strategies: {</strong>
           <strong> laravelApi: {
                provider: 'laravel/sanctum',
            },</strong>
       <strong> }</strong>
    },</code></pre>



<p>ここでは、<em>&#8220;laravelApi&#8221;</em>という名前のストラテジーを作成し、プロバイダーにLaravel Sanctumを指定しました。</p>



<h3 class="wp-block-heading">エンドポイントを設定しよう</h3>



<p>バックエンドのベースURLと認証に関わるルートを設定していきます。</p>



<pre class="wp-block-code"><code>    auth: {
        redirect: {
            login: '/auth/login',
        },
        strategies: {
            laravelApi: {
<strong>                provider: 'laravel/sanctum',</strong>
                <strong>url: 'http://localhost:8000',</strong>
<strong>                // endpoints: {
                //   login: { url: '/api/login', method: 'post' },
                //   logout: { url: '/api/logout', method: 'post' },
                //   user: { url: '/api/user', method: 'get' }
                // }</strong>
            },
        }
    },</code></pre>



<p>urlにバックエンドのURLを指定します。ここではLaravelのローカルサーバー(http://localhost:8000)を指定しています。</p>



<p>また、endpointsにログイン・ログアウト・ユーザー情報を取得するためのAPIへのパスを指定しておきます。デフォルトでは以下のように設定されています。</p>



<figure class="wp-block-table"><table><tbody><tr><td>login</td><td>/login</td></tr><tr><td>logout</td><td>/logout</td></tr><tr><td>user</td><td>/user</td></tr></tbody></table></figure>



<p>今回は、第1回でroutes/web.phpに上記と同じルートを指定しておいたため、endpointsに関する設定は不要です。デフォルトと異なるルートを設定している場合は、endpointsにパスを指定することにより、任意のエンドポイントを使用できます。</p>



<h3 class="wp-block-heading">リダイレクトの設定</h3>



<p>次に、<strong>リダイレクト</strong>に関わる設定を行います。</p>



<p>nuxt/authを導入すると、認証が必要なページへのアクセスを制限することができます。ログインされていない状態で認証が必要なページへアクセスされた場合、自動的にログインページへリダイレクトさせることができます。</p>



<p>リダイレクト先には任意のページを指定することができます。nuxt.config.jsから設定していきます。</p>



<pre class="wp-block-code"><code>auth: {
<strong>    redirect: {
        login: '/auth/login',
    },</strong>
    strategies: {
        laravelApi: {
            provider: 'laravel/sanctum',
            url: 'http://localhost:8000',

    }
}, </code></pre>



<p>authセクションにログインページのパスを指定します。上のサンプルでは、ログインページがpages/auth/login.vueにあるものとして設定してみました。</p>



<p>そして、routerにauthミドルウェアを適用します。</p>



<pre class="wp-block-code"><code>router: {
     mode: "hash",
     base: process.env.BASE_URL,
    <strong> middleware: &#91;'auth']</strong>
},</code></pre>



<p>routerのミドルウェアへの登録を忘れると、リダイレクトが動作しませんので要注意です。なお、開発環境で一時的にリダイレクトさせないようにしたいときは、ミドルウェアから外してやればOKです。</p>



<h3 class="wp-block-heading">axiosからAPIへアクセスできるようにする</h3>



<p>以上で認証に関するセットアップのほとんどが完了です。ログインやログアウトはすでに可能な状態になっています。</p>



<p>しかし、まだこの状態ではバックエンドのAPIにアクセスすることはできません。ログインが済んでいたとしても、axiosからsanctumでガードされたAPIにアクセスしようとすると、401 Unauthorizedエラーが発生してしまいます。</p>



<p><strong>これはnuxt/authでログインし取得できたCSRFトークンやクッキーなどの資格情報が、axiosからのリクエストに含まれていないことが原因です。</strong></p>



<p>axiosにはcredentialsというオプションがあり、これを有効にすることで資格情報をリクエストと一緒にサーバーへ送ることができます。nuxt.config.jsからオプションを適切に設定することで、正常にAPIへアクセスできるようになります。</p>



<pre class="wp-block-code"><code>axios: {
    baseURL: 'http://localhost:8000',
    <strong>credentials: true</strong>
},</code></pre>



<div class="wp-block-cocoon-blocks-balloon-ex-box-1 speech-wrap sb-id-1 sbs-stn sbp-l sbis-cb cf block-box"><div class="speech-person"><figure class="speech-icon"><img decoding="async" src="https://takabus.com/tips/wp-content/uploads/2021/09/man-150x150.png" alt="" class="speech-icon-image"/></figure><div class="speech-name"></div></div><div class="speech-balloon">
<p>credentialsを有効にすると、CSRFトークンの取得・更新処理も自動的に行なってくれるようになります。明示的にトークンの更新を行う必要もなくなるので、大変便利なオプションです。</p>
</div></div>



<p>オプションを設定したら、npmの開発サーバーを再起動しておきましょう。</p>



<pre class="wp-block-code"><code>Ctrl+C
$ npm run dev</code></pre>



<h2 class="wp-block-heading">ログインページをつくって、いざログイン！</h2>



<p>さあ、これで準備は万端です。いよいよ実際にログインしてみましょう。</p>



<p>pagesディレクトリにログインページ(pages/auth/login.vue)を作成します。</p>



<pre class="wp-block-code"><code>&lt;template&gt;
    &lt;input type="text" v-model="id" placeholder="id"&gt;
    &lt;input type="password" v-model="password" placeholder="パスワード"&gt;
    &lt;button @click="login"&gt;ログイン&lt;/button&gt;
&lt;/template&gt;

&lt;script&gt;
    export default {
        auth: false,
        data() {
            return {
                id: null,
                password: null
            }
        },
        methods: {
            login() {
                try {
                    // ログインする
                    const response = await this.$auth
                        .loginWith("laravelApi", {
                            data: {
                                id: this.id,
                                password: this.password
                            }
                        })
                        .then(() =&gt; {
                            // ログインに成功したら、/にページ遷移
                            window.alert("ログインしました");
                            this.$router.push("/");
                        });
                    console.log(response);
                } catch (error) {
                    // ログインに失敗したら、コンソールに出力する
                    window.alert("ログイン失敗");
                    console.log(error);
                }
            }
        }
    }
&lt;/script&gt;</code></pre>



<p>作成したページはこんな感じです。IDとパスワードを入力し、[ログイン]ボタンをクリックすると、nuxt/authによりログインが施行されるようにしました。</p>



<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="457" height="113" src="https://takabus.com/tips/wp-content/uploads/2022/07/image.png" alt="" class="wp-image-1430" srcset="https://takabus.com/tips/wp-content/uploads/2022/07/image.png 457w, https://takabus.com/tips/wp-content/uploads/2022/07/image-300x74.png 300w" sizes="(max-width: 457px) 100vw, 457px" /></figure>



<div class="wp-block-cocoon-blocks-balloon-ex-box-1 speech-wrap sb-id-1 sbs-stn sbp-l sbis-cb cf block-box"><div class="speech-person"><figure class="speech-icon"><img decoding="async" src="https://takabus.com/tips/wp-content/uploads/2021/09/man-150x150.png" alt="" class="speech-icon-image"/></figure><div class="speech-name"></div></div><div class="speech-balloon">
<p>ここではわかりやすくするため、最低限の処理を実装しています。実際の案件では、バリデーションなども適切に実装するようにしましょう。</p>
</div></div>



<div class="wp-block-cocoon-blocks-micro-balloon-2 micro-balloon micro-top mc-circle micro-copy has-background has-amber-background-color"><span class="micro-balloon-content micro-content">解説</span></div>



<p>ログインを施行するには、<code>$auth.loginWith</code>メソッドを使います。</p>



<pre class="wp-block-code"><code>// ログインする
const response = await <strong>this.$auth
    .loginWith("laravelApi", {
        data: {
            id: this.id,
            password: this.password
        }
    })</strong>
    .then(() =&gt; {
        // ログインに成功したら、/にページ遷移
        window.alert("ログインしました");
        this.$router.push("/");
    });
</code></pre>



<p>第1引数にストラテジー名(ここでは<em>laravelApi</em>)、第2引数にログインに使用するIDとパスワードを指定します。ログインボタンがクリックされたら実行されるよう、[ログイン]ボタンにclickイベントを設定しておきます。ログインに失敗した場合はcatchで受けて、”ログイン失敗”というアラートを表示させています。</p>



<p>ちなみに<code>auth:false</code>という部分は、ログインしていなくてもページを表示できるようにするためのものです。デフォルトでは各ページに<code>auth:true</code>が設定されており、ログインしないとページの表示がされないようになっています。当然ながら、ログインページはログインしていない状態で表示される必要があるため、<code>auth:false</code>を指定しています。</p>



<pre class="wp-block-code"><code>&lt;script&gt;
    export default {
        <strong>auth: false,</strong></code></pre>



<p>ログイン後は/に遷移するようにしていますので、ログイン後に表示されるページ（pages/index.vue）も作成しておきましょう。</p>



<pre class="wp-block-code"><code>&lt;template&gt;
    &lt;h1&gt;ログインしました♪&lt;/h1&gt;
&lt;/template&gt;</code></pre>



<p></p>



<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="320" height="88" src="https://takabus.com/tips/wp-content/uploads/2022/07/image-1.png" alt="" class="wp-image-1431" srcset="https://takabus.com/tips/wp-content/uploads/2022/07/image-1.png 320w, https://takabus.com/tips/wp-content/uploads/2022/07/image-1-300x83.png 300w" sizes="(max-width: 320px) 100vw, 320px" /></figure>



<p>ページを作成したら、さっそくログインしてみてください。うまくいきましたか？</p>



<h2 class="wp-block-heading">まとめ</h2>



<p>いかがでしたでしょうか。</p>



<p>SPA認証を実装しようとすると、本来はCSRFトークンの更新からクッキーに資格情報をセットしたりなど、複雑な処理を実装していく必要がありますが、Laravel Sanctumとnuxt/authを組み合わせると、かんたんにSPA認証を実装することができます。</p>



<p>参考になれば幸いです。</p>
]]></content:encoded>
					
					<wfw:commentRss>https://takabus.com/tips/1396/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>【Laravel】アップロードされたファイルのサイズを取得するには？制限するには？</title>
		<link>https://takabus.com/tips/1390/</link>
					<comments>https://takabus.com/tips/1390/#respond</comments>
		
		<dc:creator><![CDATA[ばすにっきTips]]></dc:creator>
		<pubDate>Sat, 14 May 2022 06:50:56 +0000</pubDate>
				<category><![CDATA[Laravel]]></category>
		<guid isPermaLink="false">https://takabus.com/tips/?p=1390</guid>

					<description><![CDATA[Laravelでアップロードされたファイルのサイズ（容量）を取得する方法を紹介します。]]></description>
										<content:encoded><![CDATA[
<p>Laravelでアップロードされたファイルのサイズ（容量）を取得する方法を紹介します。</p>



<h2 class="wp-block-heading">getSizeを実行するだけ</h2>



<p>リクエストされたファイルのサイズは、PHP標準の関数であるgetSizeを呼び出すことで取得できます。</p>



<pre class="wp-block-code"><code>// ファイルサイズを取得する
$filesize = $request->file("image")->getSize();</code></pre>



<h2 class="wp-block-heading">ファイルサイズを制限したいときは？</h2>



<p>アップロードされたファイルサイズの上限を設定することもできます。</p>



<p>getSize関数でファイルサイズを取得し、ifで判定すればOKです。</p>



<pre class="wp-block-code"><code>// ファイルサイズを取得する
$filesize = $request->file("image")->getSize();
// 3MBを超えていたら、400 BadRequestエラーを返す
if ($filesize > 3145728) {
    abort(400);
}</code></pre>



<p>ここでは3MBを超えるファイルが送られた場合に、400エラーを返すサンプルを紹介しました。</p>



<p>より本格的なケースではバリデータを使います。</p>



<p>php.iniでもアップロードサイズの上限を設定することができますが、これはあくまで大きなファイルを送りつけられたときの予防的措置としてのものです。基本的にはフレームワーク側でのバリデーションが必要となります。</p>



<p>参考にしていただければ幸いです。</p>
]]></content:encoded>
					
					<wfw:commentRss>https://takabus.com/tips/1390/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>【Laravel】Eloquentで取得されるデータに任意の値を追加するには？</title>
		<link>https://takabus.com/tips/1314/</link>
					<comments>https://takabus.com/tips/1314/#respond</comments>
		
		<dc:creator><![CDATA[ばすにっきTips]]></dc:creator>
		<pubDate>Fri, 29 Apr 2022 12:59:04 +0000</pubDate>
				<category><![CDATA[Laravel]]></category>
		<guid isPermaLink="false">https://takabus.com/tips/?p=1314</guid>

					<description><![CDATA[Eloquentでレコードを取得するとき、任意の値を結果に追加したいときの方法を紹介します。]]></description>
										<content:encoded><![CDATA[
<p>Eloquentでレコードを取得するとき、任意の値を結果に追加したいときの方法を紹介します。</p>



<h2 class="wp-block-heading">アクセサとは？</h2>



<p>Laravelには<span class="bold-red">アクセサ（Accessors）</span>という機能があります。</p>




<a rel="noopener" href="https://readouble.com/laravel/6.x/ja/eloquent-mutators.html" title="    6.x Eloquent：ミューテタ Laravel
" class="blogcard-wrap external-blogcard-wrap a-wrap cf" target="_blank"><div class="blogcard external-blogcard eb-left cf"><div class="blogcard-label external-blogcard-label"><span class="fa"></span></div><figure class="blogcard-thumbnail external-blogcard-thumbnail"><img loading="lazy" decoding="async" src="https://s.wordpress.com/mshots/v1/https%3A%2F%2Freadouble.com%2Flaravel%2F6.x%2Fja%2Feloquent-mutators.html?w=160&#038;h=90" alt="" class="blogcard-thumb-image external-blogcard-thumb-image" width="160" height="90" /></figure><div class="blogcard-content external-blogcard-content"><div class="blogcard-title external-blogcard-title">    6.x Eloquent：ミューテタ Laravel
</div><div class="blogcard-snippet external-blogcard-snippet"></div></div><div class="blogcard-footer external-blogcard-footer cf"><div class="blogcard-site external-blogcard-site"><div class="blogcard-favicon external-blogcard-favicon"><img loading="lazy" decoding="async" src="https://www.google.com/s2/favicons?domain=https://readouble.com/laravel/6.x/ja/eloquent-mutators.html" alt="" class="blogcard-favicon-image external-blogcard-favicon-image" width="16" height="16" /></div><div class="blogcard-domain external-blogcard-domain">readouble.com</div></div></div></div></a>



<p>アクセサとは、返り値に任意の値を追加してくれる機能のことです。モデルに定義しておくことで、データを自動的に加工した値や、任意の値を取得されるデータに追加してくれます。</p>



<h2 class="wp-block-heading">アクセサを使ってみよう！</h2>



<p>実際にアクセサを使ってみましょう。ここでは例としてブログサイトを考えてみます。</p>



<p>記事のモデル「Post」で投稿を取得した際に、データベースに格納されているすべての記事の数を同時に取得できるようにしてみたいと思います。</p>



<p>モデル（app\Models\Post）にアクセサを定義します。</p>



<pre class="wp-block-code"><code>namespace App;

use Illuminate\Database\Eloquent\Model;


class Post extends Model
{
    protected $appends = &#91;'count'];

    public function getCountAttribute()
    {
        return Post::count();
    }
}
</code></pre>



<p>アクセサの関数は<span style="" class="marker-under"><b>get＋属性名＋Attribute</b></span>という名前で定義するようにします。命名規則に従うことで、自動的にアクセサが認識されます。</p>



<p>また、<strong>$appends</strong>に追加する属性の名前を追加することで、データ取得時に自動的に実行されるようにします。</p>



<p>アクセサを定義したら、モデルからデータを取得してみましょう。</p>



<pre class="wp-block-code"><code>dd(Post::find(1))
=&gt;{id:"1",title:"sample",body:"asdf",<span class="red">count:"5"</span>}</code></pre>



<p>通常はデータベースにあるデータしか取得されませんが、アクセサが動作したことでcountという属性が追加され、データと一緒に記事数が返されていることがわかります。</p>



<h2 class="wp-block-heading">データベースから取得した値を加工してみよう！</h2>



<p>アクセサでは<span class="bold"><span class="marker-under">取得したレコードの値を参照することもできます。</span></span></p>



<p><code>$this-&gt;attributes["カラム名"]</code>で取得したレコードのデータを参照することができます。</p>



<p>例えば、記事本文（body）の文字数を一緒に返したいなら、こんな感じのアクセサを定義すればOKです。</p>



<pre class="wp-block-code"><code>//本文の文字数を一緒に返す
public function getLengthAttribute()
{
    return strlen($this-&gt;attributes&#91;"body"])
}</code></pre>



<p>$appendsにlengthを追加すれば、レコードを取得したときに本文(body)の文字数を一緒に返してくれるようになります。</p>



<p>商品金額から税込価格を取得したり、空白区切りの氏名から姓と名を取得したり、さまざまな活用法が考えられますね。</p>
]]></content:encoded>
					
					<wfw:commentRss>https://takabus.com/tips/1314/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Laravelとnuxt/authでSPA認証！ログイン機能を実装しよう！（第1回 バックエンド編）</title>
		<link>https://takabus.com/tips/940/</link>
					<comments>https://takabus.com/tips/940/#respond</comments>
		
		<dc:creator><![CDATA[ばすにっきTips]]></dc:creator>
		<pubDate>Mon, 18 Apr 2022 11:22:30 +0000</pubDate>
				<category><![CDATA[Laravel]]></category>
		<category><![CDATA[Nuxt.js]]></category>
		<category><![CDATA[Laravel Sanctum]]></category>
		<guid isPermaLink="false">https://takabus.com/tips/?p=940</guid>

					<description><![CDATA[Laravel とフロントエンドフレームワーク「Nuxt.js」を使い、SPA認証（ログイン機能）をできるだけかんたんに実装する方法を紹介していきます。]]></description>
										<content:encoded><![CDATA[
<p><strong><span class="marker-under"><mark style="background-color:rgba(0, 0, 0, 0)" class="has-inline-color has-orange-color">Laravel</mark> とフロントエンドフレームワーク「<span class="bold-green">Nuxt.js</span>」を使い、<span class="bold-red">SPA認証</span>（<span class="bold-red">ログイン機能</span>）をできるだけかんたんに実装する方法を紹介していきます。</span></strong></p>



<div class="wp-block-cocoon-blocks-tab-box-1 blank-box bb-tab bb-pickup block-box has-border-color has-green-border-color">
<ul id="block-14c748bc-4402-4f8d-b7d3-ade67c6657b5"><li>第1回 バックエンド（Laravel Sanctum）編 <a href="https://takabus.com/tips/940/">https://takabus.com/tips/940/</a></li><li>第2回 フロントエンド（nuxt/auth）編 <a href="https://takabus.com/tips/1396/">https://takabus.com/tips/1396/</a></li></ul>
</div>



<div class="wp-block-cocoon-blocks-balloon-ex-box-1 speech-wrap sb-id-1 sbs-stn sbp-l sbis-cb cf block-box"><div class="speech-person"><figure class="speech-icon"><img decoding="async" src="https://takabus.com/tips/wp-content/uploads/2021/09/man.png" alt="" class="speech-icon-image"/></figure><div class="speech-name"></div></div><div class="speech-balloon">
<p>GitHubにサンプルを公開しました。</p>



<figure class="wp-block-embed is-type-wp-embed is-provider-ばすにっきtips wp-block-embed-ばすにっきtips"><div class="wp-block-embed__wrapper">

<a href="https://takabus.com/tips/1826/" title="【nuxt/authｘLaravel SanctumでSPA認証】サンプルを公開しました" class="blogcard-wrap internal-blogcard-wrap a-wrap cf"><div class="blogcard internal-blogcard ib-left cf"><div class="blogcard-label internal-blogcard-label"><span class="fa"></span></div><figure class="blogcard-thumbnail internal-blogcard-thumbnail"><img loading="lazy" decoding="async" width="160" height="90" src="https://takabus.com/tips/wp-content/uploads/2022/07/laravelsanctum-nuxt-spa-160x90.png" class="blogcard-thumb-image internal-blogcard-thumb-image wp-post-image" alt="" srcset="https://takabus.com/tips/wp-content/uploads/2022/07/laravelsanctum-nuxt-spa-160x90.png 160w, https://takabus.com/tips/wp-content/uploads/2022/07/laravelsanctum-nuxt-spa-300x169.png 300w, https://takabus.com/tips/wp-content/uploads/2022/07/laravelsanctum-nuxt-spa-1024x576.png 1024w, https://takabus.com/tips/wp-content/uploads/2022/07/laravelsanctum-nuxt-spa-768x432.png 768w, https://takabus.com/tips/wp-content/uploads/2022/07/laravelsanctum-nuxt-spa-1536x864.png 1536w, https://takabus.com/tips/wp-content/uploads/2022/07/laravelsanctum-nuxt-spa-120x68.png 120w, https://takabus.com/tips/wp-content/uploads/2022/07/laravelsanctum-nuxt-spa-320x180.png 320w, https://takabus.com/tips/wp-content/uploads/2022/07/laravelsanctum-nuxt-spa-374x210.png 374w, https://takabus.com/tips/wp-content/uploads/2022/07/laravelsanctum-nuxt-spa.png 1920w" sizes="(max-width: 160px) 100vw, 160px" /></figure><div class="blogcard-content internal-blogcard-content"><div class="blogcard-title internal-blogcard-title">【nuxt/authｘLaravel SanctumでSPA認証】サンプルを公開しました</div><div class="blogcard-snippet internal-blogcard-snippet">GitHubにNuxtJS（nuxt/auth）とLaravel Sanctumのサンプルプロジェクトを公開しました。Laravel Sanctumとnuxt/authによるSPA認証をすぐに体験できます。Laravel SanctumとNuxtJSによるSPA認証については、以前チュートリアル記事をアップしていますので、ご活用ください。</div></div><div class="blogcard-footer internal-blogcard-footer cf"><div class="blogcard-site internal-blogcard-site"><div class="blogcard-favicon internal-blogcard-favicon"><img loading="lazy" decoding="async" src="https://www.google.com/s2/favicons?domain=https://takabus.com/tips" alt="" class="blogcard-favicon-image internal-blogcard-favicon-image" width="16" height="16" /></div><div class="blogcard-domain internal-blogcard-domain">takabus.com</div></div><div class="blogcard-date internal-blogcard-date"><div class="blogcard-post-date internal-blogcard-post-date">2022.09.10</div></div></div></div></a>
</div></figure>



<p>Laravel SanctumとNuxt/AuthによるSPA認証を体験いただくことができます。</p>



<p>(2022/9/11追記)</p>
</div></div>



<p>全2回の連載とし、第1回はSPA認証に対応したバックエンドをLaravelで構築する方法について紹介していきます。Laravelでは認証システムを簡単に実装できるライブラリが豊富に用意されており、専門的な知識が十分ではなくても、SPA認証が実装できるようになっています。そこで当記事では、SPA認証におすすめのライブラリ「<span class="red">Laravel Sanctum</span>」の紹介から、実際に実装する手順について解説していきたいと思います。</p>



<p>第2回では、フロントエンドフレーム「Nuxt.js」にログイン機能を実装していきます。Nuxt.js公式の認証モジュール「nuxt/auth」を活用し、<strong>認証に関する難しいコーディングはほぼゼロ</strong>でログイン機能を実装していく方法を紹介していきます。</p>



<div class="wp-block-cocoon-blocks-label-box-1 label-box block-box has-border-color has-deep-orange-border-color"><div class="label-box-label block-box-label box-label fab-pencil"><span class="label-box-label-text block-box-label-text box-label-text">私の開発環境はコレ！</span></div><div class="label-box-content block-box-content box-content">
<ul><li>PHP 8.0.3（7.4でも問題ありません！）</li><li>Laravel Framework 8.81.0（当記事の内容は<span class="red">Laravel 6・7</span>でも対応しています）</li><li>Nuxt.js 2</li></ul>
</div></div>



<div class="wp-block-cocoon-blocks-balloon-ex-box-1 speech-wrap sb-id-1 sbs-stn sbp-l sbis-cb cf block-box"><div class="speech-person"><figure class="speech-icon"><img decoding="async" src="https://takabus.com/tips/wp-content/uploads/2021/09/man-150x150.png" alt="" class="speech-icon-image"/></figure><div class="speech-name"></div></div><div class="speech-balloon">
<p>LaravelとNuxt.jsのプロジェクトは、完全に分離して開発されたものとして解説していきます。</p>



<p>なお、LaravelとNuxt.jsを組み合わせた際のSPA認証としては、今回紹介する以外にもたくさんの方法があります。当記事では、LaravelとNuxt.jsに用意されているライブラリをフル活用し、できる限りシンプルに実装する方法を取り上げています。</p>
</div></div>



<h2 class="wp-block-heading" id="まずはspa認証の全体像をチェック">まずはSPA認証の全体像をチェック！</h2>



<p>はじめにSPA認証がどのような流れで行われるかについて、確認しておきましょう。</p>



<div class="wp-block-cocoon-blocks-micro-balloon-2 micro-balloon micro-top mc-circle micro-copy has-background has-green-background-color"><span class="micro-balloon-content micro-content"><span class="micro-balloon-icon micro-icon fab-pencil"></span>SPA認証の処理の流れ</span></div>



<ol><li><strong>【フロントエンド】CSRFトークンを要求</strong></li><li><strong>【バックエンド】CSRFトークンを返し、ブラウザのクッキーにセット<br>【フロントエンド】ログインAPIへメールアドレスとパスワードをPOST</strong></li><li><strong>【バックエンド】認証（正しいパスワードか確認する）し、フロントエンドへ結果を返す</strong></li><li><strong>【フロントエンド】認証に成功したら、ログイン済みページへ遷移する</strong></li></ol>



<p>まず、第一にCSRFトークンの取得が必要となります。</p>



<p>CSRF（Cross-site Request Forgery）トークンというのは、正規のページからアクセスが行われていることを証明するための値のことです。いわば合言葉のようなもので、フロントエンドは必ずCSRFトークンを事前に取得しておき、APIへアクセスするときはCSRFトークンも一緒に渡す必要があります。CSRFトークンが渡されていないときはアクセスを拒否することで、不正なアクセスを防ぐことができます。</p>



<p>おそらくSPA認証を構築するうえで多くの人が躓くのは、CSRFにかかわる部分です。実際にはLaravel Sanctumとnuxt/authを使うことで、よしなに処理してくれるのですが、SPA認証におけるCSRFトークンの仕組みについては、事前にしっかり理解しておいたほうが後々（とくにフロントエンドを実装する第2回で）楽になります。Google検索してあらかじめイメージを掴んでおくことをおすすめします。</p>



<figure class="wp-block-embed is-type-wp-embed is-provider-ばすにっきtips wp-block-embed-ばすにっきtips"><div class="wp-block-embed__wrapper">

<a href="https://takabus.com/tips/1115/" title="CSRFトークンってなんの意味があるの？意外と知らないAPI通信におけるCSRFの仕組み" class="blogcard-wrap internal-blogcard-wrap a-wrap cf"><div class="blogcard internal-blogcard ib-left cf"><div class="blogcard-label internal-blogcard-label"><span class="fa"></span></div><figure class="blogcard-thumbnail internal-blogcard-thumbnail"><img loading="lazy" decoding="async" width="160" height="90" src="https://takabus.com/tips/wp-content/uploads/2022/03/CSRFトークンってなに-160x90.png" class="blogcard-thumb-image internal-blogcard-thumb-image wp-post-image" alt="" srcset="https://takabus.com/tips/wp-content/uploads/2022/03/CSRFトークンってなに-160x90.png 160w, https://takabus.com/tips/wp-content/uploads/2022/03/CSRFトークンってなに-300x169.png 300w, https://takabus.com/tips/wp-content/uploads/2022/03/CSRFトークンってなに-1024x576.png 1024w, https://takabus.com/tips/wp-content/uploads/2022/03/CSRFトークンってなに-768x432.png 768w, https://takabus.com/tips/wp-content/uploads/2022/03/CSRFトークンってなに-1536x864.png 1536w, https://takabus.com/tips/wp-content/uploads/2022/03/CSRFトークンってなに-120x68.png 120w, https://takabus.com/tips/wp-content/uploads/2022/03/CSRFトークンってなに-320x180.png 320w, https://takabus.com/tips/wp-content/uploads/2022/03/CSRFトークンってなに-374x210.png 374w, https://takabus.com/tips/wp-content/uploads/2022/03/CSRFトークンってなに.png 1920w" sizes="(max-width: 160px) 100vw, 160px" /></figure><div class="blogcard-content internal-blogcard-content"><div class="blogcard-title internal-blogcard-title">CSRFトークンってなんの意味があるの？意外と知らないAPI通信におけるCSRFの仕組み</div><div class="blogcard-snippet internal-blogcard-snippet">SPAやAPI通信におけるCSRFトークンの仕組みについて解説！トークンだけでどうして守れるのか？</div></div><div class="blogcard-footer internal-blogcard-footer cf"><div class="blogcard-site internal-blogcard-site"><div class="blogcard-favicon internal-blogcard-favicon"><img loading="lazy" decoding="async" src="https://www.google.com/s2/favicons?domain=https://takabus.com/tips" alt="" class="blogcard-favicon-image internal-blogcard-favicon-image" width="16" height="16" /></div><div class="blogcard-domain internal-blogcard-domain">takabus.com</div></div><div class="blogcard-date internal-blogcard-date"><div class="blogcard-post-date internal-blogcard-post-date">2022.03.02</div></div></div></div></a>
</div></figure>



<p>CSRFトークンがうまく取得できれば、あとは通常のログインと同様です。定義しておいたログイン用のルートにメールアドレスやパスワードをPOSTすることで認証できます。</p>



<h2 class="wp-block-heading" id="spa認証ならlaravel-sanctam">SPA認証の面倒な処理は<span class="bold-red">Laravel Sanctum</span>におまかせ！</h2>



<p>SPA認証を実装するには、CSRFトークンの発行や正規のフロントエンドかどうかの判定など、やらなくてはならない処理がたくさん出てきます。それらすべてを自前で実装することも可能ですが、バグの混入のおそれがありますし、セキュリティの観点からも推奨されません。</p>



<p><strong><span class="marker-under">そこで、今回は<span class="bold-red">Laravel Sanctum</span>というライブラリを導入していきます。</span></strong></p>




<a rel="noopener" href="https://laravel.com/docs/9.x/sanctum" title="Laravel Sanctum - Laravel 9.x - The PHP Framework For Web Artisans" class="blogcard-wrap external-blogcard-wrap a-wrap cf" target="_blank"><div class="blogcard external-blogcard eb-left cf"><div class="blogcard-label external-blogcard-label"><span class="fa"></span></div><figure class="blogcard-thumbnail external-blogcard-thumbnail"><img loading="lazy" decoding="async" src="https://laravel.com/images/og/laravel-docs.png" alt="" class="blogcard-thumb-image external-blogcard-thumb-image" width="160" height="90" /></figure><div class="blogcard-content external-blogcard-content"><div class="blogcard-title external-blogcard-title">Laravel Sanctum - Laravel 9.x - The PHP Framework For Web Artisans</div><div class="blogcard-snippet external-blogcard-snippet">Laravel is a PHP web application framework with expressive, elegant syntax. We’ve already laid the foundation — freeing ...</div></div><div class="blogcard-footer external-blogcard-footer cf"><div class="blogcard-site external-blogcard-site"><div class="blogcard-favicon external-blogcard-favicon"><img loading="lazy" decoding="async" src="https://www.google.com/s2/favicons?domain=https://laravel.com/" alt="" class="blogcard-favicon-image external-blogcard-favicon-image" width="16" height="16" /></div><div class="blogcard-domain external-blogcard-domain">laravel.com</div></div></div></div></a>



<p>Laravel Sanctumは<strong>①SPA認証 ②トークン認証 ③モバイルアプリの認証</strong>を可能とすることに特化したライブラリです。Laravel Sanctumを導入することで、CSRFトークンに関する処理など、SPA認証に特有の処理を自前でコーディングすることなく実装することができます。第2回でフロントエンドに導入する「<strong><span class="bold-red">nuxt/auth</span></strong>」などのモジュールとの相性もとても良いため、単にSPAフロントエンドと連携させたいのであれば、もっともおすすめされるライブラリとなります。</p>



<p>Laravelの公式ドキュメントにも、SPA認証にはLaravel Sanctumが推奨される旨が記載されています。</p>



<blockquote class="wp-block-quote"><p>&nbsp;if you are attempting to authenticate a single-page application, mobile application, or issue API tokens, you should use&nbsp;<a href="https://laravel.com/docs/8.x/sanctum">Laravel Sanctum</a>.&nbsp;</p><cite>https://laravel.com/docs/8.x/passport#passport-or-sanctum</cite></blockquote>



<p>もちろん、ほかのライブラリにもSPA認証を実装できるものはありますが、各ライブラリの比較をしていると到底説明しきれない量になってしまうため、ここでは詳細に踏み込むことは避けておきましょう。とりあえず、<span class="bold-red"><span class="marker-under">シンプルにSPA認証を実装するならLaravel Sanctum</span></span>という認識で問題ありません。</p>



<p>今回はSPA認証ができればOKということで、Laravel Sanctumを導入してAPIからのログインを実装してみたいと思います。</p>



<h2 class="wp-block-heading" id="laravel-sanctumをインストール">Laravel Sanctumをインストール</h2>



<p>まずは<strong><span class="red">Laravel Sanctum</span></strong>をインストールしましょう。</p>



<p>ただし、Laravel 8ではプロジェクトを作成した時点で、すでにLaravel Sanctumがインストールされていますので、この手順は不要です。Laravel SanctumはLaravel 6から使用できます。<span class="marker-under"><strong>Laravel 6～7を使用している方は以下の手順でインストールしましょう。</strong></span></p>



<p>Composerで<strong><span class="bold-red"><span class="marker-under">Laravel Sanctum</span></span></strong>をインストールします。</p>



<pre class="wp-block-code"><code><strong>composer require laravel/sanctum</strong>
Using version ^2.14 for laravel/sanctum
Package manifest generated successfully.
77 packages you are using are looking for funding.
Use the `composer fund` command to find out more!
&gt; @php artisan vendor:publish --tag=laravel-assets --ansi --force
No publishable resources for tag &#91;laravel-assets].
Publishing complete.</code></pre>



<p>Laravel Sanctumのインストールができたら、Sanctumの利用に必要なファイルを生成するコマンドを実行します。</p>



<pre class="wp-block-code"><code><strong>php artisan vendor:publish --provider="Laravel\Sanctum\SanctumServiceProvider"</strong>
Copied Directory &#91;\vendor\laravel\sanctum\database\migrations] To &#91;\database\migrations]
Publishing complete.</code></pre>



<h2 class="wp-block-heading" id="laravel-sanctumをミドルウェアに追加する">Laravel Sanctumをミドルウェアに追加する</h2>



<p>次に、ミドルウェアにLaravel Sanctumを登録して、Laravel Sanctumを有効にします。</p>



<p>app\Http\Kernel.phpを開き、<span class="marker-under"><strong><span class="red">$middlewareGroups</span>の<span class="red">api</span>にLaravel Sanctumのクラス（\Laravel\Sanctum\Http\Middleware\EnsureFrontendRequestsAreStateful::class）を追加します。</strong></span></p>



<pre class="wp-block-code"><code>・・・中略・・・   
 protected $middlewareGroups = &#91;
        'web' =&gt; &#91;
            \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,
        ],

        'api' =&gt; &#91;
            <strong>\Laravel\Sanctum\Http\Middleware\EnsureFrontendRequestsAreStateful::class,</strong>
            'throttle:api',
            \Illuminate\Routing\Middleware\SubstituteBindings::class,
        ],
    ];
</code></pre>



<p>Laravel SanctumがもともとインストールされているLaravel 8では、該当の行がコメントアウトされています。この場合はコメントを外せばOKです。</p>



<h2 class="wp-block-heading" id="アクセスを許可するドメインを設定する">アクセスを許可するドメインを設定する</h2>



<p><span class="marker-under"><strong>次にLaravel Sanctumへのアクセスを許可するドメインを指定します。</strong></span></p>



<p>Laravel Sanctumの機能を利用するには、フロントエンドのドメインを設定する必要があります。アクセス元となるフロントエンドのドメインを指定することで、外部からSanctumへの不正なアクセスを防ぐようになっています。</p>



<p>設定はconfig/sanctum.phpから行いますが、<strong>デフォルトでは.envファイルで環境変数として設定することができる</strong>ようになっています。</p>



<p>.envファイルに<strong><span class="marker-under"><span class="red">SANCTUM_STATEFUL_DOMAINS</span></span></strong>キーを追記して、フロントエンドのドメイン（ポート番号含む）を指定します。</p>



<pre class="wp-block-code"><code>SANCTUM_STATEFUL_DOMAINS=localhost:3000</code></pre>



<p>ここではNuxt.jsの開発環境（http://lcoalhost:3000）からアクセスできるように設定しておきました。</p>



<div class="wp-block-cocoon-blocks-balloon-ex-box-1 speech-wrap sb-id-1 sbs-stn sbp-l sbis-cb cf block-box"><div class="speech-person"><figure class="speech-icon"><img decoding="async" src="https://takabus.com/tips/wp-content/uploads/2021/09/man-150x150.png" alt="" class="speech-icon-image"/></figure><div class="speech-name"></div></div><div class="speech-balloon">
<p>localhost:3000はconfig/sanctum.phpであらかじめ許可設定がなされているため、本当は設定する必要はありませんが、本番環境に移行したときに設定を忘れないよう、あえて明示的に設定しています。</p>
</div></div>



<h2 class="wp-block-heading" id="corsを有効にする">CORSを有効にする</h2>



<p>クロスオリジンになる場合は、Laravelで<strong><span class="bold-red">CORS</span></strong>を有効にしておきます。</p>



<p>クロスオリジンとは、バックエンドとフロントエンドのオリジン（アドレス）が異なる状態のことをいいます。この場合はCORSを明示的に有効にしておかないと、セキュリティ対策のためアクセスが拒否されてしまいます。</p>



<div class="wp-block-cocoon-blocks-balloon-ex-box-1 speech-wrap sb-id-1 sbs-stn sbp-l sbis-cb cf block-box"><div class="speech-person"><figure class="speech-icon"><img decoding="async" src="https://takabus.com/tips/wp-content/uploads/2021/09/man-150x150.png" alt="" class="speech-icon-image"/></figure><div class="speech-name"></div></div><div class="speech-balloon">
<p>ローカル環境でもFQDNが異なればクロスオリジンとなります。</p>



<p>例えば、http://localhost:3000でNuxt.jsの開発をしつつ、http://localhost:8080で動作させたLaravelの開発サーバーにアクセスした場合、http://localhost:3000からhttp://localhost:8080へのアクセスが生じることになります。この場合も両者のオリジンは異なるため、CORSの有効化が必要です。</p>
</div></div>



<p>CORSを有効にするには<code>config\cors.php</code>を編集し、<strong><span class="marker-under">supports_credentials</span></strong>をtrueにします。</p>



<pre class="wp-block-code"><code>&lt;?php

return &#91;
    <strong>'paths' => &#91;<span class="red">'*'</span>, 'sanctum/csrf-cookie']</strong>,
    'allowed_methods' => &#91;'*'],
   <strong> 'allowed_origins' => &#91;<span class="red">'*'</span>],</strong>
    'allowed_origins_patterns' => &#91;],
    'allowed_headers' => &#91;'*'],
    'exposed_headers' => &#91;],
    'max_age' => 0,
   <strong> 'supports_credentials' => <span class="red">true</span>,
</strong>
];
</code></pre>



<p>このとき、特定のオリジンからのアクセスのみ許可したい場合は、＊の代わりに許可したいオリジンをallowed_originsに設定しておきましょう。</p>



<pre class="wp-block-code"><code>'allowed_origins' =&gt; &#91;<strong>'http://localhost:3000'</strong>],</code></pre>



<div class="wp-block-cocoon-blocks-icon-box common-icon-box block-box information-box">
<p>指定する値は<strong>オリジン</strong>なので<strong><span class="marker-under">FQDN（httpからポート番号まで）</span></strong>を指定します。ホスト名だけではダメ！</p>
</div>



<p>ただし、テスト環境ではひとまず＊にしておくことをおすすめします。正常にログインできることを確認してから制限を厳しくしていくほうが、無用なトラブルを避けることができます。</p>



<h2 class="wp-block-heading" id="セッション-クッキーを許可するドメインを設定する">セッション・クッキーを許可するドメインを設定する</h2>



<p>クロスドメインになっている場合は、セッション・クッキーを許可するドメインも設定する必要があります。</p>



<p>クロスドメインとは、バックエンドとフロントエンドのドメインが異なることをいいます。例えば、Laravelがhoge.com、フロントエンド（Nuxt.jsなど）がfuga.comでホスティングされているような状況です。クロスドメインではバックエンドからブラウザのクッキーを設定することができず、セッションも張ることができなくなります。許可するドメインをしっかり設定しておきましょう。</p>



<p>config/session.phpから設定しますが、.envからも設定できるようになっているので、.envから設定しましょう。</p>



<pre class="wp-block-code"><code>SESSION_DOMAIN=localhost</code></pre>



<div class="wp-block-cocoon-blocks-balloon-ex-box-1 speech-wrap sb-id-1 sbs-stn sbp-l sbis-cb cf block-box"><div class="speech-person"><figure class="speech-icon"><img decoding="async" src="https://takabus.com/tips/wp-content/uploads/2021/09/man-150x150.png" alt="" class="speech-icon-image"/></figure><div class="speech-name"></div></div><div class="speech-balloon">
<p>セッションクッキードメインを設定することで、クロスドメインになっていてもLaravel側からクライアントにクッキーを設定できるようになります。後で出てくるX-CSRF-TOKENを使用する上で必要となるため、ここで設定を行っておきます。</p>



<p>なお、<strong><span class="marker-under">クロスドメインになっていない場合、当手順は省略できます。</span></strong></p>
</div></div>



<h2 class="wp-block-heading" id="laravel-fortifyのインストール">ログインコントローラーの実装</h2>



<p>これにてLaravel Sanctumのセットアップは完了です。SPAフロントエンドとの認証用の通信はできるようになりました。</p>



<p>次に<strong><span class="marker-under">認証</span><span class="marker-under">用の</span><span class="marker-under">コントローラー</span></strong>を作成していきましょう。</p>



<p>Artisanコマンドを実行し、新たに認証用のコントローラー「AuthController」を作成します。</p>



<pre class="wp-block-code"><code>php artisan make:controller AuthController </code></pre>



<p>ログインとログアウトができるように実装していきます。通常の認証と同様に、Laravel標準の認証ファサード<code>Illuminate\Support\Facades\Auth</code>を使って実装することができます。</p>



<pre class="wp-block-code"><code>&lt;?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;

class AuthController extends Controller
{
    /**
     * ログイン
     *
     * @param  mixed $request
     * @return void
     */
    public function login(Request $request)
    {
        if (Auth::attempt($request-&gt;only(&#91;"email", "password"]))) {
            // レスポンスを返す
            return response()-&gt;json(&#91;'message' =&gt; 'success'], 200);
        } else {
            // エラーレスポンスを返す
            return response()-&gt;json(&#91;'message' =&gt; 'failed'], 401);
        }
    }

    /**
     * ログアウト
     *
     * @param  mixed $request
     * @return void
     */
    public function logout(Request $request)
    {
        // ログアウトする
        Auth::logout();
        // レスポンスを返す
        return response()-&gt;json(&#91;'message' =&gt; 'Logged out'], 200);
    }</code></pre>



<p>もちろんAuthファサードのほかのメソッドも使えます。Auth::checkでログイン中か判定したり、Auth::id()でログイン中のユーザーのIDを取得したりすることもできます。Laravel Sanctumを導入していても、通常の認証とまったく同じです。</p>



<p><code>routes/web.api</code>でルートを設定します。</p>



<pre class="wp-block-code"><code>&lt;?php

use Illuminate\Http\Request;

/*
|--------------------------------------------------------------------------
| Web Routes
|--------------------------------------------------------------------------
|
| Here is where you can register web routes for your application. These
| routes are loaded by the RouteServiceProvider within a group which
| contains the "web" middleware group. Now create something great!
|
*/


// SPA認証
Route::post('/login', 'AuthController@login');
Route::post('/logout', 'AuthController@logout');</code></pre>



<p>nuxt/authからはここで定義したルートにログイン・ログアウトのアクセスを行うようにします。</p>



<p>api.phpに記載しても構わないとは思いますが、その場合はエンドポイントが<strong>/api/</strong>login,logoutになることに注意しましょう。</p>



<h2 class="wp-block-heading">ルートをLaravel Sanctumで保護する</h2>



<p>Laravel Sanctumでガードしたいルートに<strong>auth:sanctumミドルウェア</strong>を適用します。</p>



<pre class="wp-block-code"><code>// routes/api.php
Route::group(&#91;'middleware' =&gt; &#91;'auth:sanctum']], function () {

    Route::get('/user', function (Request $request) {
        return $request-&gt;user();
    });</code></pre>



<p>Route::groupで適用したいルートをまるごと囲ってしまうと安心です。</p>



<h2 class="wp-block-heading" id="テストユーザーの作成-マイグレーション">テストユーザーの作成・マイグレーション</h2>



<p>最後にテストユーザーを作成しておきましょう。</p>



<p>シーダーとは、マイグレーション時に自動的にレコードを作成する機能のことです。あらかじめシーダーを作成しておくと、テストデータなどをマイグレーション時に作成することができます。</p>



<p><code>database\seeders\DatabaseSeeder.php</code>を編集し、テストユーザーを作成するシーダーを定義します。</p>



<pre class="wp-block-code"><code>&lt;?php

namespace Database\Seeders;

use Illuminate\Database\Seeder;
use Illuminate\Support\Facades\DB;

class DatabaseSeeder extends Seeder
{
    /**
     * Seed the application's database.
     *
     * @return void
     */
    public function run()
    {
        DB::table('users')-&gt;insert(&#91;
            'name' =&gt; 't',
            'email' =&gt; 't@localhost',
            'password' =&gt; bcrypt('password'),
        ]);
    }
}
</code></pre>



<p>マイグレーション時に&#8211;seedオプションをつけると上のプログラムが実行され、自動的にユーザーが作成されるようになります。</p>



<p>マイグレーションを実行し、必要なテーブルを作成します。</p>



<pre class="wp-block-code"><code><strong>php artisan migrate:fresh --seed </strong>
Dropped all tables successfully.
Migration table created successfully.
Migrating: 2014_10_12_000000_create_users_table
Migrated:  2014_10_12_000000_create_users_table (26.50ms)
Migrating: 2014_10_12_100000_create_password_resets_table
Migrated:  2014_10_12_100000_create_password_resets_table (21.52ms)
Migrating: 2019_08_19_000000_create_failed_jobs_table
Migrated:  2019_08_19_000000_create_failed_jobs_table (32.99ms)
Migrating: 2019_12_14_000001_create_personal_access_tokens_table
Migrated:  2019_12_14_000001_create_personal_access_tokens_table (42.32ms)
Database seeding completed successfully.</code></pre>



<p><strong><span class="bold-red">テーブルが作成されたら、バックエンドは完成です！長かった～</span></strong></p>



<p>なお、データベースへの接続設定については、あらかじめマイグレーション前に行っておいてください。MySQLなどのセットアップがお済みでない方はSQLiteをデータベースとして利用することができます。</p>



<div class="wp-block-cocoon-blocks-blogcard blogcard-type bct-reference">

<a rel="noopener" href="https://reffect.co.jp/laravel/laravel_sqlite" title="LaravelでSQLiteデータベースを使ってみよう | アールエフェクト" class="blogcard-wrap external-blogcard-wrap a-wrap cf" target="_blank"><div class="blogcard external-blogcard eb-left cf"><div class="blogcard-label external-blogcard-label"><span class="fa"></span></div><figure class="blogcard-thumbnail external-blogcard-thumbnail"><img loading="lazy" decoding="async" src="https://reffect.co.jp/wp-content/uploads/2018/12/Laravel_cat.png" alt="" class="blogcard-thumb-image external-blogcard-thumb-image" width="160" height="90" /></figure><div class="blogcard-content external-blogcard-content"><div class="blogcard-title external-blogcard-title">LaravelでSQLiteデータベースを使ってみよう | アールエフェクト</div><div class="blogcard-snippet external-blogcard-snippet">SQLiteを利用すると簡単にデータベースを作成することができます。Laravelでアプリケーションを作成するためには、データベースを構築する必要があります。Laravelの初期設定ではmysqlデータベースが前提になっています。テストなど...</div></div><div class="blogcard-footer external-blogcard-footer cf"><div class="blogcard-site external-blogcard-site"><div class="blogcard-favicon external-blogcard-favicon"><img loading="lazy" decoding="async" src="https://www.google.com/s2/favicons?domain=https://reffect.co.jp/laravel/laravel_sqlite" alt="" class="blogcard-favicon-image external-blogcard-favicon-image" width="16" height="16" /></div><div class="blogcard-domain external-blogcard-domain">reffect.co.jp</div></div></div></div></a>
</div>



<p>ちなみにアクセストークン関係のテーブルもマイグレーションされていますが、SPA認証の場合は不要となります。マイグレーションファイルを削除しても構いませんが、後からトークン認証も実装するかもしれないため、一応残しておきました。</p>



<p>以上でバックエンドの準備は完了です。ローカルサーバーを起動して、フロントエンドからのアクセスを待機させておきましょう。</p>



<pre class="wp-block-code"><code>php artisan serve</code></pre>



<h2 class="wp-block-heading" id="nuxt-jsのセットアップ">Nuxt.jsのセットアップ</h2>



<p>次にNuxt.jsによるフロントエンドを作成していきます。<a href="https://takabus.com/tips/1396/" target="_blank">第2回「フロントエンド編」</a>につづきます。</p>



<figure class="wp-block-embed is-type-wp-embed is-provider-ばすにっきtips wp-block-embed-ばすにっきtips"><div class="wp-block-embed__wrapper">

<a href="https://takabus.com/tips/1396/" title="Laravelとnuxt/authでSPA認証！ログイン機能を実装しよう！（第2回 フロントエンド編）" class="blogcard-wrap internal-blogcard-wrap a-wrap cf"><div class="blogcard internal-blogcard ib-left cf"><div class="blogcard-label internal-blogcard-label"><span class="fa"></span></div><figure class="blogcard-thumbnail internal-blogcard-thumbnail"><img loading="lazy" decoding="async" width="160" height="90" src="https://takabus.com/tips/wp-content/uploads/2022/07/laravelsanctum-nuxt-spa-160x90.png" class="blogcard-thumb-image internal-blogcard-thumb-image wp-post-image" alt="" srcset="https://takabus.com/tips/wp-content/uploads/2022/07/laravelsanctum-nuxt-spa-160x90.png 160w, https://takabus.com/tips/wp-content/uploads/2022/07/laravelsanctum-nuxt-spa-300x169.png 300w, https://takabus.com/tips/wp-content/uploads/2022/07/laravelsanctum-nuxt-spa-1024x576.png 1024w, https://takabus.com/tips/wp-content/uploads/2022/07/laravelsanctum-nuxt-spa-768x432.png 768w, https://takabus.com/tips/wp-content/uploads/2022/07/laravelsanctum-nuxt-spa-1536x864.png 1536w, https://takabus.com/tips/wp-content/uploads/2022/07/laravelsanctum-nuxt-spa-120x68.png 120w, https://takabus.com/tips/wp-content/uploads/2022/07/laravelsanctum-nuxt-spa-320x180.png 320w, https://takabus.com/tips/wp-content/uploads/2022/07/laravelsanctum-nuxt-spa-374x210.png 374w, https://takabus.com/tips/wp-content/uploads/2022/07/laravelsanctum-nuxt-spa.png 1920w" sizes="(max-width: 160px) 100vw, 160px" /></figure><div class="blogcard-content internal-blogcard-content"><div class="blogcard-title internal-blogcard-title">Laravelとnuxt/authでSPA認証！ログイン機能を実装しよう！（第2回 フロントエンド編）</div><div class="blogcard-snippet internal-blogcard-snippet">Laravel とフロントエンドフレームワーク「Nuxt.js」を使い、SPA認証（ログイン機能）をできるだけかんたんに実装する方法を紹介していきます。</div></div><div class="blogcard-footer internal-blogcard-footer cf"><div class="blogcard-site internal-blogcard-site"><div class="blogcard-favicon internal-blogcard-favicon"><img loading="lazy" decoding="async" src="https://www.google.com/s2/favicons?domain=https://takabus.com/tips" alt="" class="blogcard-favicon-image internal-blogcard-favicon-image" width="16" height="16" /></div><div class="blogcard-domain internal-blogcard-domain">takabus.com</div></div><div class="blogcard-date internal-blogcard-date"><div class="blogcard-post-date internal-blogcard-post-date">2022.07.29</div></div></div></div></a>
</div></figure>
]]></content:encoded>
					
					<wfw:commentRss>https://takabus.com/tips/940/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Laravel 6でもSanctamは使える？Laravel 6にLaravel Sanctamをインストール！</title>
		<link>https://takabus.com/tips/1142/</link>
					<comments>https://takabus.com/tips/1142/#respond</comments>
		
		<dc:creator><![CDATA[ばすにっきTips]]></dc:creator>
		<pubDate>Sat, 05 Mar 2022 04:11:11 +0000</pubDate>
				<category><![CDATA[Laravel]]></category>
		<guid isPermaLink="false">https://takabus.com/tips/?p=1142</guid>

					<description><![CDATA[Laravel 6にSPA認証に便利なLaravel Sanctumをインストールしてみました。]]></description>
										<content:encoded><![CDATA[
<p>Laravel 6にSPA認証に便利なLaravel Sanctumをインストールしてみました。</p>



<h2 class="wp-block-heading" id="sanctumってlaravel-6でも使えるの">SanctumってLaravel 6でも使えるの？</h2>



<p>Laravel Sanctamは、Laravel 7からデフォルトでインストールされるようになりましたが、<span class="bold-red"><span class="marker-under">Laravel 6でも使用できます。</span></span></p>



<h2 class="wp-block-heading" id="laravel-sanctamをインストール">Laravel Sanctamをインストール！</h2>



<p>Composerからインストールします。</p>



<pre class="wp-block-code"><code>composer require laravel/sanctum</code></pre>



<p>必要なファイル群を生成します。</p>



<pre class="wp-block-code"><code>php artisan vendor:publish --provider="Laravel\Sanctum\SanctumServiceProvider"</code></pre>



<p>マイグレーションして、必要なテーブルを作成します。</p>



<pre class="wp-block-code"><code>php artisan migrate</code></pre>



<p>なお、トークン認証を使用しない場合はマイグレーションしなくても構いません。</p>



<h2 class="wp-block-heading" id="ミドルウェアへの登録">ミドルウェアへの登録</h2>



<p>SPA認証をしたいときは、APIのルートにLaravel Sanctamのミドルウェアを適用します。以下のように<code>app/Http/Kernel.php</code>に追記します。</p>



<pre class="wp-block-code"><code> 'api' => &#91;
    \Laravel\Sanctum\Http\Middleware\EnsureFrontendRequestsAreStateful::class,
    'throttle:api',
    \Illuminate\Routing\Middleware\SubstituteBindings::class,
],</code></pre>



<p>あとはLaravel 7以上と同じくSPA認証を実装できます。</p>



<h2 class="wp-block-heading" id="まとめ">まとめ</h2>



<p>Laravel 6でもLaravel Sanctamをインストールすることができました。</p>



<p>Laravel Sanctamを使うと、かんたんにSPA認証を実装することができます。Laravel 6でも使えるのはありがたいですね！</p>
]]></content:encoded>
					
					<wfw:commentRss>https://takabus.com/tips/1142/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>【Laravel】リバースプロキシ下でassetヘルパを使うには？違うアドレスが返されるときの対処法</title>
		<link>https://takabus.com/tips/1084/</link>
					<comments>https://takabus.com/tips/1084/#respond</comments>
		
		<dc:creator><![CDATA[ばすにっきTips]]></dc:creator>
		<pubDate>Sun, 27 Feb 2022 04:20:26 +0000</pubDate>
				<category><![CDATA[Laravel]]></category>
		<guid isPermaLink="false">https://takabus.com/tips/?p=1084</guid>

					<description><![CDATA[リバースプロキシ環境ではassetヘルパーが正しいパスを返してくれないことがあります。リバースプロキシ環境下でもassetヘルパー関数が正しいアドレスを返すようにする方法を紹介します。]]></description>
										<content:encoded><![CDATA[
<p>リバースプロキシ環境ではassetヘルパーが正しいパスを返してくれないことがあります。リバースプロキシ環境下でもassetヘルパー関数が正しいアドレスを返すようにする方法を紹介します。</p>



<h2 class="wp-block-heading" id="リバースプロキシ下では正しいアドレスを返してくれない">リバースプロキシ下では正しいアドレスを返してくれない！</h2>



<p>assetヘルパーはアセットへのフルパスを返してくれるヘルパー関数です。おもにbladeテンプレート内でjsやcssを読み込むのに使用されます。</p>



<p>しかし、<span class="marker-under"><span class="bold"><span class="bold-red">リバースプロキシ下では、assetヘルパーが正しいアドレスを返してくれないことがあり</span></span></span><span class="marker-under"><span class="bold"><span class="bold-red">ま</span></span></span><span class="marker-under"><span class="bold"><span class="bold-red">す。</span></span></span></p>



<p>たとえば、bladeで<code>asset("/js/main.js")</code>としている状態でローカルサーバー（<code><code>http://localhost:8080</code></code>）を立ち上げたときのことを考えてみましょう。</p>



<p>assetヘルパーはLaravelがホスティングされているURLを自動的に認識し、アセットへのフルパスを返してくれます。今回の例では<code><code>http://localhost:8080</code></code>でホスティングされているため、assetヘルパーは<code>http://localhost:8080/js/main.js</code>と出力することになります。想定通りの挙動です。</p>



<p>しかし、<span class="marker-under"><strong>これをそのままリバースプロキシで外部公開してしまったらどうでしょうか。</strong></span></p>



<p>例えば、<code><strong>https://hogehoge.com</strong></code>へホスティングしてしまうと、本来読み込まれるはずのjsのフルパスは<code><strong><span class="bold-red">https://hogehoge.com</span></strong>/js/main.js</code>となるはずです。しかし、ローカルサーバーで動作しているLaravelは、アクセスがリバースプロキシ経由であるかどうかは認識できませんので、ローカル環境同様、<code><strong><span class="bold-red">http://localhost:8080</span>/js/main.js</strong></code>を返してしまいます。結果、アセットが正しく読み込まれないという問題が起こってしまうのです。</p>



<h2 class="wp-block-heading" id="envにasset-urlを追加して解決">.envにASSET_URLを追加して解決！</h2>



<p><strong>こういうときは<span class="bold-red">.env</span>ファイルに<span class="bold-red">ASSET_URL</span>を追加します。</strong></p>



<p><span class="marker-under">.<strong>envに<span class="bold-red">ASSET_URL</span>が設定されていると、assetヘルパーは設定されたURLをもとにアセットへのフルパスを返してくれ</strong></span><span class="marker-under"><strong>るように</strong></span><span class="marker-under"><strong>なり</strong></span><span class="marker-under"><strong>ます。</strong></span></p>



<pre class="wp-block-code"><code><strong>ASSET_URL</strong>=<strong>https://hogehoge.com/fuga</strong></code></pre>



<pre class="wp-block-code"><code>{{asset("/js/main.js")}}
↓
<strong>https://hogehoge.com/fuga</strong>/js/main.jsと返すようになる</code></pre>



<p>リバースプロキシで公開したいときは、ASSET_URLに公開するURLを指定しておきます。すると正しいフルパスが出力されるようになり、リバースプロキシ下でも正しくリソースが読み込まれるようになります。</p>



<h2 class="wp-block-heading" id="まとめ">まとめ</h2>



<p>リバースプロキシ下でassetヘルパーが正しく動作しないときの解決法を紹介しました。</p>



<p>なお、サブディレクトリ公開やバーチャルホストでの公開時は、Laravelは自動的に公開されているURLを認識してくれますので、当記事での方法は不要です。リバースプロキシでローカルサーバーのLaravelを公開したいとき、ご参考にしていただければ幸いです。</p>
]]></content:encoded>
					
					<wfw:commentRss>https://takabus.com/tips/1084/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
	</channel>
</rss>
