Komei22 / rails-tutorial

rails-tutorialのsample_app作っていきます
0 stars 0 forks source link

micropostをpostするAPIの検討 #118

Open Komei22 opened 7 years ago

Komei22 commented 7 years ago

下記のような仕様で考えている

リクエスト

レスポンス

参考

Komei22 commented 7 years ago

以下のようにPOSTのリクエストを送って登録しようとするMicropostを返すAPIを書いて実行した。 データベースへの登録はまだ行っていない。

curl -X POST -d 'user_id=1&content=fugafuga' http://localhost:3000/api/microposts/create | jq

この時、サーバ側でエラーが発生していた。

Started POST "/api/microposts/create" for ::1 at 2017-10-10 18:36:03 +0900
  ActiveRecord::SchemaMigration Load (0.4ms)  SELECT `schema_migrations`.* FROM `schema_migrations`
Processing by MicropostsController#create_without_auth as JSON
  Parameters: {"user_id"=>"1", "content"=>"fugafuga"}
Can't verify CSRF token authenticity.
Completed 422 Unprocessable Entity in 14ms (ActiveRecord: 0.0ms)

authenticity_tokenヘッダなどに埋め込んでいないためCSRFのセキュリティに引っかかってしまっているようだ。

Komei22 commented 7 years ago

CSRF対策に関しては特定のAPIのアクションを除外することで対応したいと思う

参考:https://qiita.com/chobi9999/items/2b59fdaf3dd8f2ed9268

Komei22 commented 7 years ago

curlでauthenticity_tokenを調べて付与してPOSTするやり方もあるみたい

参考:https://openbook4.me/users/1/sections/1280

Komei22 commented 7 years ago

CSRF対策を特定のアクションのみ除外することで対応した。 認証処理が実装できたときにCSRF対策を復活させたいと思う。

以下のようにリクエエストを送ったときに登録するmicropostを返す事ができた。 データベース登録はまだ行っていないのでcreated_atなどは空で返ってきている。

$ curl -X POST -d 'user_id=1&micropost[content]=fugafuga' http://localhost:3000/api/microposts/create | jq
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100   154    0   117  100    37    742    234 --:--:-- --:--:-- --:--:--   745
{
  "micropost": {
    "id": null,
    "content": "fugafuga",
    "user_id": 1,
    "created_at": null,
    "updated_at": null,
    "picture": {
      "url": null
    }
  }
}
Komei22 commented 7 years ago

例外処理の検討

micropostをPOSTするAPIの想定される例外として以下が挙げられる

この2つの場合に例外のjsonを返すようにする 指定されたユーザが存在していない場合

$ curl -X POST -d 'user_id=1000&micropost[content]=fugafuga' http://localhost:3000/api/microposts/create | jq
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100    97    0    57  100    40   2614   1834 --:--:-- --:--:-- --:--:--  2714
{
  "error": {
    "message": "user_id:1000 not found",
    "code": 404
  }
}

micropostがデータベースに登録できなかった場合

$ curl -X POST -d 'user_id=1&micropost[content]=ABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRST' http://localhost:3000/api/microposts/create | jq
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100   314    0   135  100   179   2708   3591 --:--:-- --:--:-- --:--:--  3653
{
  "error": {
    "message": "Posted micropost could not saved for database",
    "reason": "Maybe your micropost is over 140 charactors",
    "code": 500
  }
}

参考:WebAPIでエラーをどう表現すべき?