Udemy 1. このカテゴリーの歩き方 #02
2020年11月03日に更新

アプリケーション仕様書

この記事には

今回作るアプリケーションの仕様書を記載しています。

今回作るアプリケーション

title name
アプリ名 Rails6とNuxt.jsで作るユーザーJWT認証付きシングルページアプリケーション
OS macOS
開発環境 Docker
サーバーサイド Rails apiモード
フロントエンド Nuxt.js spaモード
データベース postgreSQL
本番環境 Heroku
バージョン管理 GitHub

バージョン

tool version
macOS 10.15
Docker 19.03以上
DockerComopse 1.25.5
Rails 6.0系
Nuxt.js 2.14以上(ブログ記事ではv2.13を使用)

Dockerコンテナ設計

docker5

開発環境の全体像

Docker_dev_intro

GitHubリポジトリ管理

Git01

本番環境へのデプロイ設計

production image

ユーザーテーブル設計

カラム デフォルト NULL 長さ 内容
name String false 30 ユーザー名
email String false 255 メースアドレス
password_digest String false 72 パスワード
activated Boolean false false メール認証フラグ
admin Boolean false false 管理者フラグ
  • name … ユーザー名。

    これは一意性のアカウント名ではなくニックネーム的な扱いです。

    入力必須、30文字制限を付けます。

  • email … ユーザーメールアドレス。

    会員登録、ログインに使用します。

  • password … ユーザーパスワード。

    会員登録、ログイン、ユーザー削除などの重要な操作に使用します。

  • activated … メール認証フラグ。

    メールが認証されたユーザーはtrueになります。

  • admin … 管理者フラグ。

    今回は使用しませんが、管理者だけが行える操作、管理画面の表示切り替えなどに使います。

ユーザー名の考え方

TwitterやQiita、GitHubなどユーザーがコンテンツを不特定多数に公開できるようなWebサービスの場合、ユーザー名を一意性のユーザーIDとして扱った方が良いでしょう。

他のユーザーがIDで検索することができたり、メールアドレスに変えてログインすることができたり、マイページのURLとして利用することができたり。

利便性が高まります。


ただ今回は、プライベートな業務アプリを想定しているため、個人を認識するためだけに使用します。

ユーザー名に一意制約や英数字必須などのバリデーションは設けません。


このように、どんなアプリケーションを作りたいのかでユーザー名の使用目的も変化します。

自分が作りたいサービスに良く似たサービスを見つけ、研究することをおすすめします。

ユーザー認証設計

今回のユーザー認証設計はこの手順になります。

  1. ユーザーが新規会員登録を行います。
  2. ユーザーテーブルにactivated: false の状態で保存されます。
  3. 登録されたメールアドレスに期限付きの認証用URLを送信します。
  4. 期限以内に認証用URLをクリックした場合
    • activated: trueになり、認証を完了します。
  5. 認証用URLの期限が切れた場合
    • ユーザーは1に戻り、もう一度会員登録を行います。
    • activated: falseの状態のユーザーはテーブルに保存されたままになります。

メールアドレスの一意性

今回のユーザー認証設計の場合、emailカラムに一意制約を付けると期限切れのユーザーは二度と新規会員登録できなくなります。

そこで同じメールアドレスは何度でも保存可能とし、認証済みのユーザーが既に存在する場合は保存不可とします。

これにより認証済みメールアドレスの一意性を保ちます。

あなたの力になれること
私自身が独学でプログラミングを勉強してきたので、一人で学び続ける苦しみは痛いほど分かります。そこで、当時の私がこんなのあったら良いのにな、と思っていたサービスを立ち上げました。周りに質問できる人がいない、答えの調べ方が分からない、ここを聞きたいだけなのにスクールは高額すぎる...。そんな方に向けた単発・短期間メンターサービスを行っています。下のサービスへお進みください。
独学プログラマのサービス
次の記事はこちら
1. このカテゴリーの歩き方 #01
【お知らせ】UdemyでRails × Nuxt.jsの動画を公開することになりました
1. このカテゴリーの歩き方 #02
アプリケーション仕様書
1. このカテゴリーの歩き方 #03
このカテゴリーの歩き方(まずはここをチェック)
1. このカテゴリーの歩き方 #04
(Docker+Rails6+Nuxt.js+PostgreSQL)=>Heroku 環境構築~デプロイまでの手順書
2. Docker入門 #01
Docker for Macをインストールする手順
2. Docker入門 #02
分かるDocker解説。仮想環境・コンテナ・Dockerイメージ・Dockerfileとは何か?
2. Docker入門 #03
分かるDocker解説。DockerComposeとは何か?
3. Dockerを使ったRails+Nuxt.js環境構築 #01
【Docker+Rails6+Nuxt.js】今回作成するアプリの開発環境の全体像を知ろう
3. Dockerを使ったRails+Nuxt.js環境構築 #02
【MacOS】Homebrew経由でGitをインストールする方法
3. Dockerを使ったRails+Nuxt.js環境構築 #03
Rails6を動かすAlpineベースのDockerfileを作成する(AlpineLinuxとは何か)
3. Dockerを使ったRails+Nuxt.js環境構築 #04
Nuxt.jsを動かすAlpineベースのDockerfileを作成する(C.UTF-8とは何か)
3. Dockerを使ったRails+Nuxt.js環境構築 #05
.envファイルを使ったdocker-compose.ymlの環境変数設計
3. Dockerを使ったRails+Nuxt.js環境構築 #06
Rails6・Nuxt.js・PostgreSQLを動かすdocker-compose.ymlファイルを作成する
3. Dockerを使ったRails+Nuxt.js環境構築 #07
docker-compose.ymlを使ってRails6を構築する(PostgreSQLパスワード変更方法)
3. Dockerを使ったRails+Nuxt.js環境構築 #08
docker-compose.ymlを使ってNuxt.jsを構築する
4. 複数プロジェクトのGit管理 #01
複数プロジェクトで行うGit管理の全体像を理解しよう(Gitサブモジュール解説)
4. 複数プロジェクトのGit管理 #02
【Git】既存の子ディレクトリをサブモジュール管理に変更する手順
4. 複数プロジェクトのGit管理 #03
【GitHub】秘密鍵の生成・公開鍵を追加・SSH接続するまでを画像で分かりやすく
4. 複数プロジェクトのGit管理 #04
【GitHub】リモートリポジトリの追加・サブモジュールのリンク設定を行う
5. RailsAPI×Nuxt.js初めてのAPI通信 #01
【Rails6】"Hello" jsonを返すコントローラを作成する
5. RailsAPI×Nuxt.js初めてのAPI通信 #02
【Nxut.js】axiosの初期設定を行う(baseURL・browserBaseURLを解説)
5. RailsAPI×Nuxt.js初めてのAPI通信 #03
【Rails6】Gem rack-corsを導入してCORS設定を行う(オリジン・CORSとは何か)
6. Heroku.ymlを使ったDockerデプロイ #01
デプロイ準備。Herokuへ新規会員登録を行いHerokuCLIをインストールする
6. Heroku.ymlを使ったDockerデプロイ #02
heroku.yml解説編。Docker環境のRails6をHerokuにデプロイする(1/2)
6. Heroku.ymlを使ったDockerデプロイ #03
HerokuCLI-manifestのデプロイ解説編。Docker環境のRails6をHerokuにデプロイする(2/2)
6. Heroku.ymlを使ったDockerデプロイ #04
Dockerfile解説編。Docker環境のNuxt.jsをHerokuにデプロイする(1/2)
6. Heroku.ymlを使ったDockerデプロイ #05
デプロイ完結編。Docker環境のNuxt.jsをHerokuにデプロイする(2/2)
7. モデル開発事前準備 #01
【Rails6】application.rbの初期設定(タイムゾーン・I18n・Zeitwerk)
7. モデル開発事前準備 #02
【Rails6】モデル開発に必要なGemのインストールとHirb.enableの自動化
7. モデル開発事前準備 #03
【Docker+Rails】A server is already running. Check /tmp/pids/server.pidエラーの対応
7. モデル開発事前準備 #04
【Docker】<none>タグのイメージを一括削除する & Rails .gitignoreの編集
8. ユーザーモデル開発 #01
Railsユーザーモデル作成。テーブル設計・ユーザー認証設計を理解する
8. ユーザーモデル開発 #02
Railsユーザーモデルのバリデーション設定(has_secure_password解説)
8. ユーザーモデル開発 #03
Railsバリデーションエラーメッセージの日本語化(ja.yml設定方法)
8. ユーザーモデル開発 #04
EachValidatorクラスのカスタムバリデーション設定(Rails6/lib以下読込)
8. ユーザーモデル開発 #05
Rails環境ごとにSeedデータ切り替えるseeds.rbの書き方
8. ユーザーモデル開発 #06
Rails6から導入された並列テストを理解する
8. ユーザーモデル開発 #07
Railsユーザーモデルバリデーションテスティング(name/email/password)
8. ユーザーモデル開発 #08
Nuxt.jsからRailsのユーザーテーブルを取得しHerokuにデプロイする
9. Nuxt.jsフロント開発事前準備 #01
【Nuxt.js2.13超解説】バージョンアップ手順と6つの新機能+2つの変更点
9. Nuxt.jsフロント開発事前準備 #02
Docker AlpineベースのNode.js上で動くNuxt.jsにVuetifyを導入する
9. Nuxt.jsフロント開発事前準備 #03
VuetifyにカスタムCSSを導入してオリジナルブレイクポイントを作る
9. Nuxt.jsフロント開発事前準備 #04
Nuxt.jsにnuxt-i18nを導入して国際化に対応する
10. ログイン前のレイアウト構築 #01
Nuxt.jsのレイアウト・ページ・コンポーネントの役割を理解しよう
10. ログイン前のレイアウト構築 #02
Nuxt.js ウェルカムページを構成するコンポーネントファイル群を作成しよう(1/4)
10. ログイン前のレイアウト構築 #03
Nuxt.js ウェルカムページにアイキャッチ画像・アプリ名・メニューボタンを表示しよう(2/4)
10. ログイン前のレイアウト構築 #04
Nuxt.js addEventListenerでスクロールを検知しツールバーの色を変化させよう(3/4)
10. ログイン前のレイアウト構築 #05
Nuxt.js ウェルカムページをレスポンシブデザインに対応させよう(4/4)
10. ログイン前のレイアウト構築 #06
Nuxt.js 会員登録ページのレイアウトファイルを作成しよう(1/4)
10. ログイン前のレイアウト構築 #07
Nuxt.js 名前、メール、パスワードのコンポーネントファイルを作成しよう(2/4)
10. ログイン前のレイアウト構築 #08
Nuxt.js 親子コンポーネント間の双方向データバインディングを実装する(3/4)
10. ログイン前のレイアウト構築 #09
Nuxt.js Vuetifyのv-text-fieldを使った会員登録フォームのバリデーション設定(4/4)
10. ログイン前のレイアウト構築 #10
Nuxt.js ログインページ実装とHerokuデプロイまで(router. replaceとpushの違いとは)
11. ログイン後のレイアウト構築 #01
Nuxt.js ログイン後のツールバーを作成しよう(inject解説)
11. ログイン後のレイアウト構築 #02
Nuxt.js アカウントメニューページ・ログアウト機能を実装しよう(nuxt-child解説)
11. ログイン後のレイアウト構築 #03
Nuxt.js ログイン後のトップページにプロジェクト一覧を表示しよう
11. ログイン後のレイアウト構築 #04
Nuxt.js プロジェクトページにVuetifyのナビゲーションドロワーを追加しよう
11. ログイン後のレイアウト構築 #05
Nuxt.js paramsIDからプロジェクトを検索してVuexに保存しよう
12. サーバーサイドのログイン認証 #01
JWTとは何か?(ruby-jwtのインストール)
12. サーバーサイドのログイン認証 #02
【Rails×JWT】ログイン認証解説とJWT初期設定ファイルの作成
12. サーバーサイドのログイン認証 #03
【Rails×JWT】トークン発行とデコードを行うAuthTokenクラスの作成
12. サーバーサイドのログイン認証 #04
【Rails×JWT】 ログイン判定を行うAuthenticatorモジュールの作成
12. サーバーサイドのログイン認証 #05
【Rails×JWT】UserクラスからJWTを扱うTokenizableモジュールの作成
12. サーバーサイドのログイン認証 #06
【Rails×JWT】AuthTokenクラスとAuthenticatorモジュールをテストする
12. サーバーサイドのログイン認証 #07
【Rails×JWT】JWTをCookieに保存するログインコントローラーの実装
12. サーバーサイドのログイン認証 #08
【Rails×JWT】ログインコントローラーのテストとHerokuデプロイ
13. フロントエンドのログイン認証 #01
【Rails×Nuxt.js】クロスオリジン通信でのCookie共有設定
13. フロントエンドのログイン認証 #02
【Nuxt.js】Railsからのログイン成功レスポンスをVuexに保存する
13. フロントエンドのログイン認証 #03
【Nuxt.js】ローカルストレージの有効期限を暗号化する(crypto-js解説)
13. フロントエンドのログイン認証 #04
【Nuxt.js】JWT有効期限内のユーザーをログインしたままにする実装
13. フロントエンドのログイン認証 #05
【Nuxt.js】ログイン前後のリダイレクト処理をミドルウェアで実装する
13. フロントエンドのログイン認証 #06
【Nuxt.js】ログイン失敗時のトースターをグローバルイベントとして作成する
13. フロントエンドのログイン認証 #07
【Nuxt.js】エラーページを作成する
13. フロントエンドのログイン認証 #08
【Rails×Nuxt.js】デモプロジェクトの作成とHerokuデプロイ(ログイン認証完)
14. 本番環境への対応 #01
【Rails×Nuxt.js】SafariのクロスサイトCookie保存拒否に対応する
SPA開発
ブログ構築
小ネタ集