Nuxtjs/Railsを勉強中の人へ送る、SPA構成のID/PW認証付きサンプルをGithubに公開

# 概要
自分が __Nuxtjs(Typescript + Vuetify + Jest)__ を理解するために、apiサーバーとしてRailsを作りNuxtjs + RailsのSPA構成のサンプルを作りました。せっかくなので、OSSで公開しNuxtjsの環境構築でハマっている人のためになればと思いこの記事を記載しました。
この内容は、勉強会でもLTした内容です。その時の[Speaker Deckはこちら](https://speakerdeck.com/walkersumida/sample-nuxtjs-rails) です。ご興味がある方は御覧ください。

今後も時間が有るときにコミットしていきます。このOSSの方針としては、どのサービスで必ず使用するであろう機能を今後も追加していく予定です。
その一つとして認証機能はどんなサービスでも必要になってくると考えたので、既に実装してあります。今後はGoogle認証などのOauth認証系も追加予定です。

# 環境
Dockerがインストールされていればどんな環境でもサンプルを動作させることができると思います。
NuxtjsとRailsのリポジトリは分けています。
- Nuxtjs Sample Repo: https://github.com/walkersumida/nuxtjs-sample
- Rails Sample Repo: https://github.com/walkersumida/rails-api-for-nuxtjs

# サンプル起動方法
上記2つのリポジトリをローカルにcloneし、ターミナルからそのcloneしたディレクトリに移動して、 `make docker_up` とコマンドを打つだけです。
※Nuxtjs側は結構時間かかります
<img width="808" alt="スクリーンショット 2019-09-21 15.25.59.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104056/c0e2e780-e4d3-4d70-c99c-0b126af529b4.png">

※ 上記はRailsのディレクトリに移動し起動している画像

# 起動
起動が完了したら、 [http://0.0.0.0:8080/sign_in](http://0.0.0.0:8080/sign_in) にアクセスしてください。以下のようにログイン画面が出てくるので、[ID/Password](https://github.com/walkersumida/rails-api-for-nuxtjs#demo-user)を入力してログインしてみてください。
<img width="934" alt="スクリーンショット 2019-09-21 15.41.49.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104056/e2a6be52-9a4d-658e-24a0-0edf5cd41d14.png">

# ログイン後
ログイン後は、Postというオブジェクトの一覧ページ( [http://0.0.0.0:8080/posts](http://0.0.0.0:8080/posts) )に遷移します。このページは、ログインしていないと参照できないページとなっています。現在は、Postオブジェクトの追加と削除する機能があるので、試しに追加/削除を行ってみてください。
<img width="572" alt="スクリーンショット 2019-09-21 15.42.41.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104056/0cc7f9fc-4cbf-301f-39fa-26570f7c911e.png">

# 認証の仕組み
今回は[devise_token_auth gem](https://github.com/lynndylanhurley/devise_token_auth)を使って認証を実装しています。
Token-base認証という仕組みを使っています。ここでは簡単に説明しますが、認証が成功すると、それ以降のRails apiサーバーからのレスポンスに使い捨てのトークンが送られてきます。そのトークンを次のapiサーバーリクエスト時にセットしapiサーバー側でトークンを検証し検証が成功すると、認証が成功したとみなしレスポンスを返してきます。
詳しくは、devise_token_authのDocsに詳しく書いてあるので参照してみてください。

# Vuetifyjs
これは、マテリアルデザインの便利なコンポーネントライブラリです。 [Docs](https://vuetifyjs.com/en/components/api-explorer) 通りに書くとリッチなコンポーネントを簡単に配置できるのでとても便利です。
<img width="1344" alt="スクリーンショット 2019-09-23 10.12.26.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104056/08de24e7-7c14-51d9-9e16-94c7d4172585.png">


# Nuxtjs Test(Jest)
Nuxtjsサンプルをcloneしたディレクトリで `make docker_exec CMD='yarn test -u'` を実行するとJestが起動し、テストが実行されます。成功することを確認してみてください。
<img width="799" alt="スクリーンショット 2019-09-21 16.00.28.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104056/0559c189-3a34-bdbf-fc68-f953d738bfe0.png">

# Rails Test(Rspec)
Rails apiサンプルをcloneしたディレクトリで `make docker_exec CMD='bin/rspec'` を実行するとRspecが起動し、テストが実行されます。成功することを確認してみてください。
<img width="807" alt="スクリーンショット 2019-09-21 16.05.38.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104056/4524ddf7-469f-5efb-6962-39d69ad4937b.png">

# CI
NuxtjsとRailsのサンプルはCircleCIと連携しているので、Pushする毎にTestが実行されるようになっています。

# まとめ
動作しましたでしょうか。冒頭にも記載しましたが今後もどんどんコミットしていく予定でいるので、starをいただけるとやる気が出ます。
あとはデバックしたり、実際に機能を追加したりして遊んでいただき、NuxtjsとRailsを楽しんでいただければ嬉しいです。

現在は、このRails apiサーバーを利用して、[Flutterのリポジトリ](https://github.com/walkersumida/flutter_sample)も立てコミットし始めました。こりらも認証周りは大体出来上がっているので、こちらも興味がある方は是非、starをお願いします笑
Flutterの件も、今後Qiitaにまとめていく予定ですのでお待ちいただければと思います。

# 参照
- Nuxtjs Sample Repo: https://github.com/walkersumida/nuxtjs-sample
- Rails Sample Repo: https://github.com/walkersumida/rails-api-for-nuxtjs
- devise_token_auth gem: https://github.com/lynndylanhurley/devise_token_auth
- Vuetifyjs: https://vuetifyjs.com/en/components/api-explorer
- Jest: https://jestjs.io/docs/en/getting-started
- Rspec: https://github.com/rspec/rspec-rails
- TypeScript: https://www.typescriptlang.org/docs/home.html
- Speaker Deck: https://speakerdeck.com/walkersumida/sample-nuxtjs-rails