GitHubアカウントDBを作成した。
成果物
開発環境
- Windows XP Pro SP3 32bit
- cmd.exe
- SQLite3
WebService
- GitHub
- アカウント
- ユーザ名
- パスワード
- AccessToken
- scopes
- repo
- scopes
- API v3
- アカウント
テーブル
テーブル名 | 説明 |
---|---|
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 | - | - | ○ |
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を取得してみようか。