何ができて、何ができていないのか。
前回まで
http://ytyaru.hatenablog.com/entry/2017/12/09/000000
概要
課題
- 実装
- 抽象化
- CUI系
- Database系
- Web系
- 抽象化
- テスト
解決済み
Web系の抽象化
- GitHubAPIの認証用requestsライブラリ引数生成を抽象化した
- 認証なし, Basic, TwoFactor, OAuth
- DBからTokenを取得する
- APIでTokenを生成してDBに登録する
- APIごとに認証方法を使い分ける
RequestParameter.py
- 認証クラス配列を生成する
AuthenticationsCreator.py
- DBとユーザ名から以下の認証クラス配列を生成する
- OAuth, TwoFactor/Basicの優先順に作成できるものがあれば作る
- HTTPメソッド文字列からリクエストメソッドを識別して実行する
AuthenticationsCreator.py
- Basic認証またはTwoFactor認証を返すメソッドを作成した
./cui/register/command/
配下の各クラスで同じ処理を書いているのを解消した
- Basic認証またはTwoFactor認証を返すメソッドを作成した
ssh-keygenとsshコマンド
SshKeyGen.py
アカウント登録
- GitHubAPIを叩く認証部分を重複なくスマートに実装したい
./cui/register/command/
のInserter.py
とUpdater.py
に重複コード多数あるので解消したい/cui/register/
のgithub/api/v3
は/web/service
のと重複する- 認証部分のコードが多数重複している
- アカウント作成前なので統合できない
- アカウント管理で2FA関連を一部実装
テスト
単体、結合テスト
機能テスト
未解決
Web系の抽象化
- APIごとに必要なHttpHeadersの
Accept
指定を抽象化する- たとえばLicenseAPIはすべて
application/vnd.github.drax-preview+json
が必要である
- たとえばLicenseAPIはすべて
- GETの引数であるparamsを抽象化する
- POSTの引数であるdataを抽象化する
paramsやdataはAPIごとに異なる。Pythonの名前付き引数にしたい。それをどのように抽象化すればいいのか。
辞書引数**kwargs
ならできそうだが、名前や初期値を指定して何を渡せばいいかわかるようにしたい。
引数のバリデートが必要だから抽象化は難しいか。
理想はAPIごとのdataやparamsの代入やバリデート処理を一切書かない上、以下のようにAPIを呼び出せること。
GitHubUploader.py
Client(AuthenticationCreator(db, username).Create())
client.repo.create(name='', desc='', url='', ..., sort='', direct='', per_page=100)
GitHubUserRegister.py
Client([BasicAuthentication(username, password)])
client.auth.create(scopes)
client.sshkeys.create()
client.SetAuthentications([OAuthAuthentication(token), BasicAuthentication(username, password)])
client.users.get(username)
client.repo.gets()
動作確認していない
- アカウント登録 update
- ユーザ名の更新について動作未確認
- メールアドレスの更新について動作未確認
未実装
- アカウント管理で2FA関連が一部未実装
- リカバリコードやその有効期限の保存
セキュリティ
- ふだん使うTokenに権限がたくさん付与されてしまう
枠組み
細かいこと
- SSHのconfigを編集したい(定義順などきれいに整形したい)
- AccessTokenの
Scope
とGrant
の文言を統一したい- dqn.sakusakutto.jp/2012/03/database_refactoring.html
改修しないと問題になる可能性がある
- ツールでAccessTokenを自動作成したが、サイトで削除してしまった。その後、ツールでアップロードしようとしたが、Tokenが存在しないためAPI実行時にエラーが出た
他にもユーザ操作次第で不具合が生じそうなワークフローがないか考えてみたほうがいいか。
GitHubUserRegister.py
でinsertサブコマンドのテスト時、途中でエラーになるとAccessTokenが作成されたままになってしまう。途中で異常終了したときはTokenやSSH鍵などAPIで生成したものを削除するようにしたい。残すとセキュリティホールになりうるが、手動で削除するのも面倒。
改修せずとも問題にはならない
./cui/register/command/Inserter.py
__CreateRecordAccount()
Accounts
テーブルのCreatedAt
とUpdatedAt
の値が1970-01-01T00:00:00Z
固定になっている。UsersAPIで日時を取得して設定したい
- ユーザ作成日時取得のついでにプロフィール情報も取得したい
- 指定ユーザの全リポジトリを再取得したい
- AccessTokenの権限設定を任意にしたい