O slideshow foi denunciado.
Seu SlideShare está sendo baixado. ×

LaravelとNuxt.jsを業務で取り入れる際に得た知見

Anúncio
Anúncio
Anúncio
Anúncio
Anúncio
Anúncio
Anúncio
Anúncio
Anúncio
Anúncio
Anúncio
Anúncio

Confira estes a seguir

1 de 30 Anúncio

Mais Conteúdo rRelacionado

Diapositivos para si (15)

Semelhante a LaravelとNuxt.jsを業務で取り入れる際に得た知見 (20)

Anúncio

Mais recentes (20)

LaravelとNuxt.jsを業務で取り入れる際に得た知見

  1. 1. LaravelとNuxt.jsを業務で取り入れる際 に得た知見 株式会社ITプロパートナーズ 戎島功 森山智哉 2018/04/25 Laravel/Vue.js勉強会#4 1
  2. 2. 自己紹介 森山智哉 株式会社ITプロパートナーズ エンジニア Laravel / Vue / Nuxt / Twitter: @frostndays 2
  3. 3. 自己紹介 戎島功(えびすじまいさお) 株式会社ITプロパートナーズ エンジニア Laravel / Vue.js / Nuxt.js Twitter: @isao_x 3
  4. 4. 話すこと 1. プロジェクト概要 2. 認証方法について 3. Nuxt.js 環境設定の読み込み 4. axiosのラッパー 5. 開発の際に役立った便利ツール 4
  5. 5. ・株式会社ITプロパートナーズで新規開発中 ・toC Webサービス ・大規模なSNSみたいなもの 1−1 プロジェクト概要 5
  6. 6. 1−2 技術スタック ・MySQL ・Nginx ・AWS ・AmazonLinux ・Docker ・Git ・PHP 7.1.7 ・Laravel 5.5 ・HTML 5 ・CSS 3/SCSS ・JavaScript/ECMAScript2015(ES6) ・Vue.js 2.9.3 ・Nuxt.js 1.0.0 6
  7. 7. 1−3 サーバー構成 ユーザー 管理者 7 APIサーバー / 管理画面フロント側サーバー
  8. 8. ・Laravel Passportとは APIでログイン認証を行うためのLaravelのライブラリ ・使い方 laravelPassportで使用するTableを生成 認証用のルーティングが自動生成される 2−1 認証方法について 8
  9. 9. 2−2 Laravel Passportでの認証フロー ③ AccessTokenを渡す ① ID/password ④ ヘッダーにAccessTokenをセッ ト ⑤ 認証が必要なぺージにアクセス ② AccessTokenを発行 9
  10. 10. 2−3 Laravel Passport facebook認証 ・使用したライブラリ danjdewhurst/laravel-passport-facebook-login ・使い方 laravelPassportと同様のエンドポイントを使用する ID/passの代わりにFacebookのアクセストークンをPOSTする userテーブルにはfacebookID用のカラムを用意する 10
  11. 11. 2−4 Laravel Passport エンドポイント変更 デフォルトのエンドポイント oauth/token を api/oauth/token に変更 app/Providers/AuthServiceProvider.php public function boot() { $this->registerPolicies(); Route::group([ 'middleware' => 'Barryvdh¥Cors¥HandleCors::class'], function() { $callback = null; $options = [ 'prefix' => 'api/oauth', 'namespace' => '¥Laravel¥Passport¥Http¥Controllers', ]; Passport::routes($callback, $options); }); } 11
  12. 12. 2−5 Laravel Passport トークン有効期限 12 ・有効期限チェック機能の追加 使用するアクセストークンに有効期限を設定 。。が有効期限をチェックして期限切れかどうかを判定する機能は無い ため
  13. 13. 2−5 Laravel Passport トークン有効期限 13 ・有効期限チェック機能の追加 使用するアクセストークンに有効期限を設定 。。が有効期限をチェックして期限切れかどうかを判定する機能は無い ため 有効期限をチェックする機能追加 有効期限が切れていていたらリフレッシュトークンを使用
  14. 14. 2−5 Laravel Passport トークン有効期限 14 public function checkToken(ResourceServer $server, Request $request) { // ヘッダーのアクセストークンを取得 $psr = (new DiactorosFactory)->createRequest($request); $psr = $server->validateAuthenticatedRequest($psr); $reqToken = $psr->getAttribute('oauth_access_token_id'); // 有効期限が切れていないかチェック $accessToken = OauthAccessToken::where('id', $reqToken) ->where('expires_at', '>', Carbon::now()) ->first(); }
  15. 15. nuxt.config.js module.exports = { env: { baseUrl: process.env.BASE_URL || 'http://localhost:3000' } } 3−1 Nuxt.js 環境設定の読み込み 15 通常、Nuxt.jsでは、apiサーバーのurlとか、laravel passportで生成したsecret key とかっていう環境固有の定数をnuxt.config.jsで定義します。 こんな感じです↓(Nuxt.js公式ドキュメントより引用)
  16. 16. 3−2 Nuxt.js 環境設定の読み込み 16 env.js exports.env = { BASE_URL: 'http://localhost:3000', CLIENT_ID: 2, PASSPORT_SECRET: 'dummyMWN3ojUoBUWww5o3w5TrviGbW8BI9Vdummy', }; 今回、Laravelと同じようにenvファイルを用意してそれで定数を管理したいと思 ったので、env.jsというファイルを作って、そこで環境固有の定数を定義しまし た。 こんな感じです↓
  17. 17. nuxt.config.js const env = require('./env.js'); module.exports = Object.assign(env, { … } env.jsをnuxt.config.jsでrequireする 3−3 Nuxt.js 環境設定の読み込み 17
  18. 18. 4−1 axiosのラッパー services/http.js import axios from 'axios'; const axiosBase = axios.create({ baseURL: '', timeout: 10000, headers: { 'Access-Control-Allow-Origin': '*', 'X-Requested-With': 'XMLHttpRequest', }, }); 18
  19. 19. 4−2 axiosのラッパー services/http.js get(url, config = {}) { return axiosBase.get(url, config); }, post(url, data = {}, config = {}) { return axiosBase.post(url, data, config); }, delete(url, config = {}) { return axiosBase.delete(url, config); }, 19
  20. 20. services/http.js axiosBase.interceptors.request.use((config) => { // 特定のURL指定が無い場合のみ、server/client 判定 if (!config.baseURL) { config.baseURL = process.server ? process.env.API_URL_SERVER : process.env.API_URL_CLIENT; } return config; }, error => Promise.reject(error)); 4−3 axiosのラッパー 20
  21. 21. 4−4 axiosのラッパー services/http.js setAuthorizationToken(token) { if (token) { axiosBase.defaults.headers.common.authorization = `Bearer ${token}`; } else { delete axiosBase.defaults.headers.common.authorization; } }, 21
  22. 22. ・Clockwork(ブラウザでのLaravelのデバッグに役立つchrome拡張) https://chrome.google.com/webstore/detail/clockwork/dmggabnehkmmfmdffgajcflpdjlnoemp ・sequel-pro-laravel-export(migrationを自動生成するsequelPro拡張) https://github.com/cviebrock/sequel-pro-laravel-export ・SQL to Laravel Builder(SQLからクエリビルダーへ変換するWebサービス) http://www.midnightcowboycoder.com/ ・Vue.js devtools(ブラウザでのVue.jsのデバッグに役立つchrome拡張) https://chrome.google.com/webstore/detail/vuejs-devtools/nhdogjmejiglipccpnnnanhbledajbpd?hl=ja 5−1 開発の際に役立った便利ツールなど 22
  23. 23. ・PHPのコーディング規約はPSR-2を採用 https://www.php-fig.org/psr/psr-2/ ・PHPのLintツールはPHP_CodeSnifferを採用 https://github.com/squizlabs/PHP_CodeSniffer 5−2 開発の際に役立った便利ツールなど 23
  24. 24. 5−3 開発の際に役立った便利ツールなど 24 ・ES6のコーディング規約はeslintのeslint-config-airbnbがベース https://github.com/airbnb/javascript/tree/master/packages/eslint-config-airbnb ・vue.jsのコーディング規約はvue.js公式のスタイルガイドがベース https://jp.vuejs.org/v2/style-guide/index.html ・ES6のlintツールはeslintを採用 https://github.com/eslint/eslint
  25. 25. LaravelとVue.js(Nuxt.js)を使ってみて 25
  26. 26. LaravelとVue.js(Nuxt.js)を使ってみて よかった!! 26
  27. 27. おしまい ですが、、、 27
  28. 28. おしまい ですが、、、 ITプロパートナーズではLaravel、Vue.jsで開発したいエンジ ニアを募集しています。 28
  29. 29. おしまい ですが、、、 ITプロパートナーズではLaravel、Vue.jsで開発したいエンジ ニアを募集しています。 ご興味のある方は是非お声掛けください!! 29
  30. 30. おしまい ご清聴ありがとうございました!! 30

Notas do Editor

  • 【森山】30秒

    今回は、LaravelとNuxt.jsを業務で取り入れる際に得た知見について

    ITプロパートナーズの森山と戎島の二人でお話させて頂きます!


    弊社ではLaravelとVue.jsのフレームワークであるNuxt.jsを使ってプロダクトを開発中です。

    Laravelは以前から使っていたのですが、Nuxt.jsは今回始めて使いました。
    その際に調べたり自分たちで考えてたまった知見を一部紹介したいと思います。



  • 【森山】30秒

    まずは自己紹介をさせていただきます。


    ITプロパートナーズでエンジニアやってます!森山と申します


    もともとにいてSierにいてwebベンチャーに転職してきました
    昔はSierで電子カルテとか触ってました


    最近laravelとNuxtでプロダクト開発をメインでやっています!


  • 【戎島】30秒
    株式会社ITプロパートナーズでエンジニアをやっているエビスジマイサオといいます。

    ベンチャー企業を何社か経験しているエンジニアです。
    以前はruby書いていましたが、最近はlaravelとvue書いています。
    最近はマネジメント業務が多めです。
  • 【森山】20秒

    今日お話したいことはこちらです。

    本当はもっとたくさんお話したいことがあるのですが、プロダクトがまだ完成していないので、そこまで複雑ではない部分をお話します。
  • 【森山】10秒

    今回、弊社で作っているLaravel、Nuxt.jsのプロダクトの概要はこんな感じです。
    toC向けの大規模なSNSみたいなものです。
  • 【森山】60秒

    使っている技術としてはこんな感じです。

    弊社の他のプロダクトはほぼほぼこんな感じですが、Nuxt.jsは今回初めて使いました。

    今回はLarvelバージョン5.5を採用しています。
    このプロダクト1月くらいからは作りはじめました。それと同じくらいの時期に、Laravelが5.6がリリースされて、ライブラリとか使えなくなったら困ると思って、以前から実績のある5.5で作りました。

    実際やってみたら、主要なライブラリが結構5.6にすぐに対応していて、5.6にしておいたら良かったんですが、タイミングを逃してしまいました。。。
    余裕があれば今からでも5.6に上げれないかと検討してます。

    また、Nuxt.jsは1.0を採用したのですが、
    こちらも開発しだしてしばらく経ったころ、Nuxt.js2.0のリリースが発表されたので、そちらもリリース前に余裕あればバージョンあげちゃおうかと思ってます。

    次は全体のシステム構成についてお話します
  • 【森山】60秒

    今回のサーバー構成はこんな感じです。


    サーバはユーザー側の画面のレンダリングを行っているNuxt.jsとAPIサーバーとして使用してるlaravelの2台構成になります

    ユーザー側のレンダリングを行っているNuxtはSSRモードで使用しています
    NuxtはSSRモードとSPAモードというのがありますが、今回はSSRモードで使用しています

    SPAモードを選択しなかった理由は、ユーザがコンテンツを作成し、そのコンテンツをTwitterやFacebookにシェアするといった機能があるため
    OGPタグなどの懸念もあり今回はSSRモードを選択しました

    LaraveはAPIサーバー兼、管理用ページのレンダリングを担当しています

    次に今回のプロダクトの認証方法についてお話させていただきます
  • 【森山】30秒

    APIでログイン認証を行うためにLaravelPassportというライブラリをつかいました

    フロントからの使いかたは、vue.jsだとlaravel Passport VueなどlaravalPassport用の認証用のライブラリがありますが、

    APIを叩くだけなので、ライブラリを使わないでも簡単に認証機能が実装出来ます

    ルーティングファイルにルーティングは書き込まれないですが、Laravel起動時にlaravelPassport用の認証に使用するルーティングが読み込まれます

  • 【森山】50秒

    LaravelPassportを使用した
    ID/Password認証のフローを説明します

    最初に起動時に自動読み込まれるエンドポイント(oauth/token)に対して
    シークレットキーやID、passwordをpostしてアクセストークンを取得します


    ユーザー側は発行されたアクセストークンをヘッダーにセットすることで、認証が必要なページに対してアクセスすることができるようになります

    認証が必要なルートに対しては、middlewareを設定することで、ヘッダーにアクセストークンがない場合はそのルートに対するアクセスできなくなります


    次にlaravelPassportで追加設定した箇所などを説明させて頂きます
  • 【森山】30秒

    今回はFacebookでのログイン認証も実装しました

    laravel-passport-facebook-loginというライブラリを導入することで
    laravelPassportの機能を拡張しています

    これを導入することで、アクセストークン取得するときに、ID/passの代わりにFaceBookのアクセストークンを
    POSTすることで、ユーザー認証ができます

    ユーザーのカラムにID/PASSの代わりにfacobookIDを持たせる必要があります

  • 【森山】30秒
    次にエンドポイントの変更についてお話します。


    アクセストークンを生成するエンドポイントはlaravelPassportで自動読み込みされます


    今回プロジェクトの設計上、自動生成されるエンドポイントを変更したかったので

    サービスプロバイダーのbootメソッドで引数として変更したいパスを指定することで
    自動生成されるエンドポイントを変更しています

    アクセストークンを取得するデフォルトのエンドポイントはoauth/tokenなのですが、

    laravelのapiのエンドポイントはプレフィックスにapiがついています

    そのため統一するために頭にapiをつけて、api/oauth/tokenとしました

    次にトークンの有効期限についてお話させていただきます
  • 【森山】40秒

    laravelPassportでは生成するアクセストークンに有効期限を設定できます 手順も公式に載っていて、設定するのは簡単なので

    アクセストークンの有効期限が切れていたらアクセス禁止にするという機能を実現したかったんですが。。。。


    有効期限をチェックしてアクセス出来なくするっていう機能がなかったので
  • 自分で用意しました


    今回は有効期限をチェックする機能を追加して

    もし有効期限が切れていたら、リフレッシュトークンを使用して
    アクセストークンを再発行するようにしました
  • アクセストークンをチェックする実際のソースコードはこんな感じになります

    リクエストのヘッダーにセットされているアクセストークンを
    DBに問い合わせて有効期限を確認しています


    認証周りについては以上になります


    次にNuxtとvue周りについて戎島よりお話させて頂きます
  • 【戎島】40秒
    あと、Nuxt.jsで工夫したのが環境設定の読み込みです。

    通常、Nuxt.jsでは、apiサーバーのurlとか、laravel passportで生成したsecret keyとかっていうproductionとかlocalとか環境固有の定数をnuxt.config.jsで定義します。

    こんな感じです。この例はnuxt.jsの公式のドキュメントから引用しました。

    で、今回はこんな感じにしました
  • 【戎島】
    こちらですね。

    Laravelと同じようにenvファイルを用意してそれで定数を管理するようにしました。
    env.js自体はgitignoreしてて、env.js.exampleというファイルをgit管理するというLaravelと同じ方法を取っています。
  • このenv.jsをnuxt.config.jsで読み込むんですが、nuxt.config.jsはes5なので、imoprtではなく、requireする必要があります。

    ここはちょっと注意が必要です。
  • axiosのラッパー(1/4)

    今回のプロジェクトでは、axiosを直接使わずに、axiosをラッピングして使いました。

    目的としては、
    ヘッダーにデフォルトの値をセットしたいっていうのと、
    動的にヘッダーに値をセットしたいからです。

    axiosBaseというデフォルトのパラメータを持つオブジェクトを定義しています。
    ここで定義しておくことでaxiosを使う各vueで同じ値をセットしなくても済みます。
  • axiosのラッパー(2/4)

    http.jsでは、各vueにてaxiosと同じ使用感で扱えるように、axiosとインタフェースを揃えています。
    get, post, put, delete, patchなどがそれにあたります。
  • axiosのラッパー(3/4)

    また、今回はサーバーサイドとクライアントサイドのどちらでajax通信をするかによって、APIサーバーのURLを変えています。
    同じプライベートネットワークにいるAPIサーバーにリクエストを飛ばすので、サーバーサイドからajaxするときはプライベートIPでサーバーを指定しています。

    仕組みとしては、interceptors.request(インターセプターズ・リクエスト)によって、リクエストを送る前に処理を割り込ませてURLを切り替えています。
  • axiosのラッパー(4/4)

    また、独自のメソッドも定義しています。
    これはlaravelPassportでの認証の際に必要になるのですが、動的に取得したtokenをheaderにセットしています。
  • 開発の際に役立ったツールをいくつか紹介します。

    一つ目はLaravelのデバッグツールClockworkです。
    chromeの拡張機能なのですが、これをインストールすると、デベロッパーツールにClockworkというタブが増えます。
    デバッグを有効にしているlaravelのアプリケーションでこれを使うと、発行しているクエリがみれたり、スタックトレースが見れて、デバッグに役立ちます。
    同じような機能を持つcomposerのライブラリでデバッグバーというのがありますが、Clockworkはライブラリを入れる必要がないので、こちらを使っています。

    (実演する)

    二つ目はLaravelのマイグレーションファイルを自動生成してくれるsequel-pro-laravel-exportです。
    前提として、sequelproっていうmysqlのGUIクライアントアプリを使っている前提です。
    sequelproっていうのはmysqladminみたいなもので、guiでdb操作できるアプリです。windowsやmacに対応しています。
    このsequelproのプラグインである、sequel-pro-laravel-exportをインストールすると、既存のdbからマイグレーションファイルを生成できます。便利ですね。

    (実演する)

    【クエリビルダ変換ツール(実演する)】
    sqlをlaravelのクエリビルダに自動変換してくれます
    生のクエリを書くほうに慣れている方はこちらを使うと便利です
    複雑なSQLだと正しく変換されないので注意してください

    select
    admins.display_name,
    users.email
    from user_test
    inner join users
    on user_test.user_id = users.id

    inner join
    user_codes
    on users.id = user_codes.user_id

    inner join
    admins
    on user_codes.admin_id = admins.id
    group by admins.display_name,users.email

    【vueデバッグツール】
    chromeの拡張ツールvue-xのstoreの中身や、発生したイベントのログが見れます
  • 【戎島】30秒
    PHPのコーディング規約はphp-figという団体が定めているPSR-2という規格を採用しています。
    lintツールはPHP_CodeSnifferを使ってます。
  • 【戎島】40秒
    JSのコーディング規約はairbnbが公開しているes6の規約をベースに使っています。
    また、es6ではなく、vue.jsに関する部分はvue.jsの公式のスタイルを参考にしています。
    で、lintツールはeslintを使ってます。
  • はい。LaravelとVue.jsを使って、良かったと思うことが何個かあります。
    まず、採用ページへの応募者のレベルが上がありました!!
    面接で、「Laravelやりたい」っていう人や「Vue.js」やりたいっていう人がよくいます。

    あと、イベントなどでVue.jsをやっていると言うと、興味を持ってもらいやすいなとも感じますね。

    SCOUTERさんと一緒にこうやってイベント開けたのもLaravelとVueやってたからですしね。
  • で、最後にお伝えしたいことがあります。
  • ITプロパートナーズではLaravel、Vue.jsで開発したいエンジニアを募集しています!!
  • ご興味のある方は是非お声掛けください!!
    また、ご質問などあれば、この後の懇親会でお声掛けください!!
  • ご清聴ありがとうございました!!

×