「認証周りの設計が手戻りになった」手戻りにならないために認証で確認するべきこと

「認証周りの設計が手戻りになった」手戻りにならないために認証で確認するべきこと

「認証周りの設計が手戻りになった」手戻りにならないために認証で確認するべきこと

タイトルは今入っている現場で実際に起きた事です。

Auth_APIのフローを作ったのですが、OKを貰った構成だとどう考えても『?』な画面デザインが上がってきました。
「これどういう事?」
大枠では似たような話をするチームメンバー。
でも状況を場合分けして「この画面って『A』の場合はこういう事だけど、『B』の場合だとこういう事になるよね」と詳細を詰めていこうとすると、メンバー間で認識が違うことが発覚しました。
企画側ではどう考えているんですか?と投げると超漠然とした答えが…。

手戻りは不徳の致すところですけど、漠然とした状態で作りながら考えるも良いけど、セキュリティも絡む認証くらいはしっかり詰めて考えようぜ。

認証の手戻りの原因は?

これはいくつかのパターンがあると思います。
そんなパターンをまとめてみます。

  1. 認証権限とアクセス可能なデータにミスマッチ
  2. Token発行したのに受け取る段取りがない
  3. Token発行に必要な情報がミスマッチ
  4. 業務フロー的にパスワード知らない人(権限ない人)にAuth叩かそうとしてる

他にもコード間違えてるとかありますけど、そんなのは置いておきます。
これ、最初の段取りしっかりしていれば、大概の問題は解決できます。

Authに関係する登場人物(端末)を把握/理解する

Authに関係する登場人物とは端末も含みます。
例えば個人のスマホにAPI_Tokenを渡すとします。そのTokenに関係する人物と端末なので、関連する登場人物は下のようになります。

  • スマホを利用しているユーザー
  • ユーザーが利用しているスマホ
  • Tokenを発行するサーバー

ここに、アプリを通してとなるともう一人増えます。

  • API_Tokenを利用するアプリ

今回発生した問題はこの登場人物がチーム内でバラバラだった事に原因がありました。

「スマホでTokenを受け取り保存します」

この言葉で、私はアプリに対してTokenを渡すことをイメージし、別の方はユーザーに対してTokenを渡すことをイメージしてました。
で結果として発生したのが【Tokenを記載する画面があるPC向けページのデザイン】これを見て私が「なんじゃそりゃ」となった訳です。

5W1Hをしっかり追う

5W1Hってこれです。
2HにしてコストHow muchが入ることもありますが(課金の話が出ない限り)認証設計では1Hで良いと思います。

  • Why(なぜ):背景・経緯・目的
  • What(なにを):内容定義・要件
  • Who(だれが):体制・役割
  • When(いつ):マイルストーン・スケジュール
  • Where(どこで):場所
  • How to manage(どのようにする):全体管理

また、認証関連では5Wを6W【What to use(なにをつかって):道具 追加】にして考えるとより良い答えに辿り着けます。
先程の「スマホでTokenを受け取り保存します」のケースで6W1Hを考えてみます。

私の発想

Why:スマホでデータを取得するために
What:スマホにインストールされたアプリが利用できる認証Tokenを
Who:スマホアプリが
When:起動した時に
Where:ユーザーのスマホアプリ上で
What to use:電話番号を利用して
How to manage:端末のアプリ固有の番号とその番号で利用出来るTokenを取得する

別の方の発想

Why:サーバーからでデータを取得するために
What:利用者個人に紐づいた認証Tokenを
Who:利用者が
When:スマホアプリ起動時に
Where:ユーザーのスマホアプリ上で
What to use:電話番号を利用して
How to manage:Tokenを発行しスマホに値をコピーする

私はTokenはスマホアプリ固有と考えていたので、ResponceでTokenを渡しサーバー側はハッシュ化して保存の予定でした。
PCで利用なんざ聞いてないし。

認識の差異が生まれた根本原因

5W1Hの確認で理解出来た事は、私と別の方の間には理解している登場人物に差があると言うこと。

  • 利用者のPC

私にはこれが見えていないので、私が絵を描こうとすれば無視されます。(感知していないので当然ですよね)
利用者の方が複数の端末でログインする事なんて想定する必要がなかった訳です。

私が考えたフローだと【アプリと関連づけたtoken】なので、再インストールするとアプリのイニシャルが変わるります。
再インストールするとガチャで当てたキャラが飛ぶスマホアプリと同じ構造ですね。
そのため、PCで使えるようにしたとしても、そもそものTokenが異なるのでデータ連携をしません。
まぁね、違う絵面を考えてた人(PCという登場人物を知っていた人)からすると、ダメ出しするよね。

手戻りにならないために認証で確認するべきこと

タイトル回収します。
認証周りを設計するときに、なにに気をつけるべきか。
私なりに取りまとめたのが下の9項目です。

  1. 登場人物を全て洗い出す。
  2. その登場人物がそれぞれ何をするのか、5W1Hでまとめる。
  3. チーム内で意識/認識の齟齬が無いか細かく確認する
  4. 認識が違いそうだと感じた場合はフローを絵に起こし差を明確にする
  5. 確認出来た「差」に対して正否判定を行い「正」を共有する
  6. 思考の足りないパーツが浮かび上がった場合、課題点を絵に起こしチーム内で共有する
  7. 課題点に対するアイディアを募り判断する
  8. 全ての判断についてGitHubのReadMeなりWikiなりにまとめて決定事項の共有を行う
  9. この共有された決定事項の確認をチーム内のルールにする

「これだけ」と言えない程度に項目数も作業ボリュームもありますが、手戻りするよりよっぽど単納期で片付くはずです。

まとめ

手戻りは精神的にも辛いですよね。
こういった事を減らすには「1に確認、2に確認」です。

自分がプロジェクトリーダーであり、全ての決定権を持っていたとしても作業する部下はそうではありません。
決定した情報を確認できるスペースの確保は必須だと思います。
「〇〇だと思っていた」が一番NGです。
「〇〇だと知っている」と言える環境を作っていきましょう。

さぁ、手戻り箇所考え直すか。