前書き
SPAなどで使われる、アプリケーションサーバー(以下、APP側) をreactやvue.jsで実装、データ処理などはAPIサーバー(以下、API側) で行うといったアプリケーション。
フロントとバックエンドが明確に分かれているため開発効率が良いことや、APIは使いまわしが効くので、 APP側を別のプラットフォームに移すときなどはフロントだけに集中できたりといったメリットがあるので結構好きな開発方法です。
今回したかったことは、上記構成でのアプリケーション作成時に、どのアプリでもだいたい使うユーザー操作や、二次認証、トークンによるセッション管理等を爆速で始められるように、ユーザー認証等ができるベースAPIを作ってみました。
API一覧
POST | /api/v1/account/regist | 本登録認証用のURLを発行します |
GET | /api/v1/account/temp | 仮認証中の状態を返します |
POST | /api/v1/account | ユーザー情報の本登録を行います |
GET | /api/v1/account | トークンを発行します |
POST | /api/v1/account/reset | パスワード再発行用のURLを発行します |
PUT | /api/v1/account | パスワードの更新を行います |
POST | /api/v1/account/delete | 退会用のURLを発行します |
DELETE | /api/v1/account/ | ユーザー情報を論理削除します |
とりあえずは上記8つのAPIをexpressで作りました。
以下からそれぞれのAPIの動作を説明していきます。
各APIの仕様
【POST】/api/v1/account/regist
本登録認証用のURLを発行します
Parameters
param | description | required | type |
account | Eメールアドレス | required | string |
Responses(application/json)
status | object | type | example |
201 | message | string | 入力したアドレス宛にメールを送信しました |
400 | message | string | このメールアドレスはすでに利用されています。 |
403 | message | string | type:[“The account field is required.”] |
500 | message | string | サーバー処理にて問題が発生しました。 |
内部ロジック
【GET】/api/v1/account/temp
メールアドレスに届いたURLをAPP側で表示するときに叩くイメージです。
認証状態を返します。(APP側の仕様次第では省略可)
Parameters
param | description | required | type |
uuid | UUID | required | string |
type | 発行タイプ | required | int |
Responses(application/json)
status | object | type | example |
200 | message | string | ok |
400 | message | string | 認証URLの有効期限切れ、もしくはURLが正しくありません |
403 | message | string | type:[“The type
field is required.”] |
500 | message | string | サーバー処理にて問題が発生しました。 |
内部ロジック
【POST】/api/v1/account
ユーザー情報の本登録を実行します。
Parameters
param | description | required | type |
uuid | UUID | required | string |
password | パスワード | required | string |
userName | ユーザー名 | required | string |
Responses(application/json)
status | object | type | example |
201 | message | string | ユーザー登録が完了しました。 |
400 | message | string | このメールアドレスはすでに利用されています。 |
403 | message | string | type:[“The uuid
field is required.”] |
500 | message | string | サーバー処理にて問題が発生しました。 |
内部ロジック
【GET】 /api/v1/account
トークンを発行します
Parameters
param | description | required | type |
account | Eメールアドレス | required | string |
password | パスワード | required | string |
Responses(application/json)
status | object | type | example |
200 | token | string | eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VyIjoxLCJpYX… |
400 | message | string | メールアドレスまたはパスワードが正しくありません |
403 | message | string | メールアドレスまたはパスワードが正しくありません |
500 | message | string | サーバー処理にて問題が発生しました。 |
内部ロジック
【POST】 /api/v1/account/reset
パスワード再発行用メールを送信
Parameters
param | description | required | type |
account | Eメールアドレス | required | string |
Responses(application/json)
status | object | type | example |
201 | message | string | 入力したアドレス宛にメールを送信しました |
400 | message | string | メールアドレスまたはパスワードが正しくありません |
403 | message | string | type:[“The type
account is required.”] |
500 | message | string | サーバー処理にて問題が発生しました。 |
内部ロジック
【PUT】 /api/v1/account/
パスワードの更新を行います
Parameters
param | description | required | type |
uuid | UUID | required | string |
old_password | パスワード | required | string |
new_password | パスワード | required | string |
Responses(application/json)
status | object | type | example |
201 | message | string | ユーザー情報を更新しました |
400 | message | string | メールアドレスまたはパスワードが正しくありません |
403 | message | string | type:[“The type
account is required.”] |
500 | message | string | サーバー処理にて問題が発生しました。 |
内部ロジック
【POST】/api/v1/account/delete
退会用のURLを発行します
Parameters
param | description | required | type |
account | Eメールアドレス | required | string |
Responses(application/json)
status | object | type | example |
201 | message | string | 入力したアドレス宛にメールを送信しました |
400 | message | string | メールアドレスまたはパスワードが正しくありません |
403 | message | string | type:[“The type
account is required.”] |
500 | message | string | サーバー処理にて問題が発生しました。 |
【DELETE】/api/v1/account
ユーザー情報を論理削除します
Parameters
param | description | required | type |
uuid | UUID | required | string |
password | パスワード | required | string |
Responses(application/json)
status | object | type | example |
201 | message | string | 退会処理が完了しました |
400 | message | string | メールアドレスまたはパスワードが正しくありません |
403 | message | string | type:[“The type
account is required.”] |
500 | message | string | サーバー処理にて問題が発生しました。 |
あとがき
一通り作ってみましたが、あれもしたいこれもしたいが増えてきて仕様検討と実装を同時にしていくとなかなか時間がかかってしまいましたが、これでユーザー情報を持つアプリケーション作成時に作業が捗りそうです。
後はトークンをheaderに付与したAPIを随時追加していく形になります。
もっと形になってきたら何かの形で公開しようと思っていますので、使いたい開発者の方はご連絡いただけると喜びます