Fumiya-Matsumoto / run_manage_spa

0 stars 0 forks source link

API設計【Postモデル】 #5

Open Fumiya-Matsumoto opened 2 years ago

Fumiya-Matsumoto commented 2 years ago

概要

PostモデルのAPIを設計する

目的達成のために

参考

Fumiya-Matsumoto commented 2 years ago

Postに関するAPIエンドポイントを修正する

現状①

問題

練習投稿がユーザーIDごとにしか取得できないようになっていて不便 メソッド名 エンドポイント アクション
GET /v1/users/:user_id/posts(.:format) v1/posts#index
POST /v1/users/:user_id/posts(.:format) v1/posts#create
GET /v1/users/:user_id/posts/:id(.:format) v1/posts#show
PATCH /v1/users/:user_id/posts/:id(.:format) v1/posts#update
PUT /v1/users/:user_id/posts/:id(.:format) v1/posts#update
DELETE /v1/users/:user_id/posts/:id(.:format) v1/posts#destroy

解決案

Fumiya-Matsumoto commented 2 years ago

エンドポイントを修正

以下のように修正した。また、postrecordsに関するエンドポイントは削除した。 メソッド名 エンドポイント アクション
GET /v1/posts(.:format) v1/posts#index
POST /v1/posts(.:format) v1/posts#create
GET /v1/posts/:id(.:format) v1/posts#show
PATCH /v1/posts/:id(.:format) v1/posts#update
PUT /v1/posts/:id(.:format) v1/posts#update
DELETE /v1/posts/:id(.:format) v1/posts#destroy
GET /v1/users/:user_id/posts(.:format) v1/posts#user_index

修正箇所

config/routes.rbを修正した。

Rails.application.routes.draw do
  namespace :v1 do
    resources :posts
    mount_devise_token_auth_for 'User', at: 'auth'
    resources :users do
      get 'posts', to: "posts#user_index"
      resources :best_times
      resources :objective
    end
  end
end
Fumiya-Matsumoto commented 2 years ago

Postに関するリクエストはログイン中のユーザーにしかできないように設定

Fumiya-Matsumoto commented 2 years ago

トークン認証について

認証方式には、Cookie(Session)による認証方式とTokenによる認証方式がある。

Cookie(Session)による認証方式

Cookieは、Webサーバーがクライアントに預けておく極小なファイルのことをさす。 クライアントがWebサーバーに初めて接続(Login)した際に、Webサーバーがクライアントに対してCookieファイル(SessionID)を発行し、HTTPレスポンスのヘッダを利用して送る。その際に発行されたSession情報(SessionID)にはログイン情報が含まれる。 次回以降、クライアントがWebサーバーにアクセスした際は、リクエストヘッダに含まれるCookie(SessionID)をサーバーが参照し、実際にサーバーに保存されているSession情報と合致した際に認証されたとみなされる。

Tokenによる認証方式

Tokenによる認証も、Cookieと同じく、まずはクライアントがWebサーバーに接続(Login)した際に、Tokenが返される。ただ、ここで違うのは、サーバーにその情報を保存はしない。「認証に成功した」というToken(いわゆる「認証情報」)を持ち、リクエストする度にリクエストヘッダにTokenを含んで送る

参考

以下の記事を参考に実装したら、認証が実現できた! Rails6.0とdevice_token_auth でトークンベースで認証を実装する~confirmable + action mailerの設定まで

Fumiya-Matsumoto commented 2 years ago

参考になりそうな記事

【Rails】devise_token_authでToken認証を実装する

Fumiya-Matsumoto commented 2 years ago

課題

現状、ある投稿の編集、削除がログインしているユーザーであれば誰でもできる状態にあるため、その投稿を作ったユーザーにしかこれらが行えないようにしたい。

解決

current_v1_user.id == @post.user_idのときにしか投稿の編集・削除が行えないようにした。

      def update # 現在ログイン中のユーザーの投稿であれば編集可能
          if current_v1_user.id == @post.user_id
              @post.update(post_params)
              render json: {}, status: :no_content
          else
              render json: {}, status: :forbidden
          end
      end

      def destroy # 現在ログイン中のユーザーの投稿であれば削除可能
          if current_v1_user.id == @post.user_id
              @post.destroy
              render json: {
                  post: @post
              }, status: :no_content
          else 
              render json: {}, status: :forbidden
          end
      end
Fumiya-Matsumoto commented 2 years ago

トークン認証に必要なuid、client、access-tokenをどう取得して、クライアントに保持させるかがまだ不明瞭だが、以下の記事が役に立ちそう。クライアント側を作る際に参考にする。

access-token これはリクエスト毎にユーザーのパスワードとして提供されます。この値のハッシュ・バージョンは、後で比較するためにデータベースに保管されます。この値はリクエスト毎に変更されるべきです。 client これにより異なるクライアント上で複数の同時セッションを管理することができます。たとえば、携帯電話とラップトップの両方で同時に認証を受けたい場合があります。 expiry 現在のセッションが失効になる日にちです。これは、クライアントがAPIリクエストを必要とせずに期限切れのトークンを無効にするために使用できます。 uid ユーザーを識別するために使用される一意の値。アクセストークンでユーザーのDBを検索すると、APIがtiming attacksを受けやすくなるため、これが必要です。

参考記事