やってみる

アウトプットすべく己を導くためのブログ。その試行錯誤すらたれ流す。

GitHubアカウントDBを作成した

GitHubアカウントDBを作成した。

成果物

GitHubGitHub.Accounts.Database

開発環境

WebService

テーブル

テーブル名 説明
Accounts メアド、パスワード、ユーザ名
TwoFactors 二要素認証用キー
AccessTokens WebAPI用Token

テーブル親子関係

  • Accounts
    • TwoFactors
    • AccessTokens

Accounts

名前 Key unique NotNull
Id integer P - -
Username text - -
MailAddress text -
Password text - -
CreateAt text - - -
  • たぶんUsernameもuniqueだと思うけど、GitHubの仕様もよく知らないし、テキトーで。
  • CreateAtはアカウント作成日時をyyyy-MM-dd HH:mm:ss書式で記録する。SQLite3に日付型は無いのでtext。必須ではないのでNULLでもいい。とくに使う予定もない項目でただの目安。

TwoFactors

名前 Key unique NotNull
Id integer P - -
AccountId integer F -
Secret text - -
  • Secretがキモ。二要素認証キー取得するとき、QRコードを読み取ると表示されるURIの中にあるはず。16桁のランダム文字列だと思う

AccessTokens

名前 Key unique NotNull
Id integer P - -
AccountId integer F -
AccessToken text - -
Scopes text - - -

Scopes

前回考えたScopeについては、結局text型の列にした。カンマ区切りでスコープ名を記録する。

以下、注意点。

  • カンマの前後にスペースなど余計な文字は一切入れないこと
  • スコープ名は大文字小文字を区別して完全一致させること

検索

LIKE句によりカンマ区切りのものを検索できることが確認できた。以下のようにするとrepo権限を持ったTokenを検索する。

select * from AccessTokens where (',' || Scopes || ',') LIKE '%,repo,%';

Not NULL

Scopesは必須ではない。NULLのレコードについては以下のような扱いが考えられる。

  • ScopesがNULLのレコードの場合、APIでScopeを問い合わせた結果を登録するようにする
  • 指定したScopeのものが一件もなかった場合、ScopesがNULLのものを取得するのもアリか。API実行してみて権限がないエラーだったら残念でした。その場合、次回以降も同じような過ちを繰り返す可能性がある

必須にしなかった理由は以下のとおり。

  • Scopeの値はGitHubの仕様により定められた値のため、APIから取得した値をそのまま設定するのが無難
    • 必須にすると、手入力insertするときに不正な文字リテラル値が混入してしまうかもしれない
  • GitHubサイトの設定画面で変更したときローカルDBへ反映し忘れて、API実行したらエラーになった」というワークフローもありうる。このとき、エラーになったら自動でスコープを問い合わせるAPIを叩くようにすると自動解決できそう
  • repoスコープを付与したTokenだけを登録して使うように運用した場合でも使える(scopesで絞り込むのが面倒なため実装しない場合でも使える)

所感

ここからが本番。まずはGitHubAPIでScopesを取得してみようか。