Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Speaker Deck
PRO
Sign in
Sign up for free
CLIでOAuth/OIDCを快適に利用する
Hidetake Iwata
July 09, 2018
Technology
0
270
CLIでOAuth/OIDCを快適に利用する
Gopher Dojo #2
2018.07.09
Hidetake Iwata
July 09, 2018
Tweet
Share
More Decks by Hidetake Iwata
See All by Hidetake Iwata
Rewrite Go error handling using AST transformation
int128
1
970
Cluster AutoscalerをTerraformとHelmfileでデプロイしてPrometheusでモニタリングする / Deploy the Cluster Autoscaler with Terraform and Helmfile, Monitor with Prometheus
int128
3
1.3k
認証の仕組みとclient-go credential plugin / authentication and client-go credential plugin
int128
7
5.8k
AppEngine × Spring Boot × Kotlin
int128
0
64
いつものJIRA設定
int128
1
120
Swaggerのテンプレートを魔改造した話 / Customize Swagger Templates
int128
1
4k
本番環境のリリースを自動化した話
int128
0
510
Swagger × Spring Cloud
int128
0
59
The Evolution of System Architecture
int128
0
76
Other Decks in Technology
See All in Technology
Dev Containers ことはじめ - 失敗から学ぶ開発環境運用法
streamwest1629
0
270
ML PM, DS PMってどんな仕事をしているの?
line_developers
PRO
1
200
NGINXENG JP#2 - 3-NGINX Plus・プロダクトのアップデート
hiropo20
0
150
日経電子版だけじゃない! 日経の新規Webメディアの開発 - NIKKEI Tech Talk #3
sztm
0
110
Hasuraの本番運用に向けて
nori3tsu
0
270
re:Inventで発表があったIoT事例の紹介と考察
kizawa2020
0
120
Technologies for developing editors / Webエディタ開発を支える技術
shuta13
1
230
ECテックカンファレンス2023 EC事業部のモバイル開発2023
tatsumi0000
0
150
SPA・SSGでSSRのようなOGP対応!
simo123
2
140
plotlyで動くグラフを作る
kosshi
0
700
私見「UNIXの考え方」/20230124-kameda-unix-phylosophy
opelab
0
140
オンプレk8sとEKSの並行運用の実際
ch1aki
0
130
Featured
See All Featured
Why Our Code Smells
bkeepers
PRO
326
55k
How GitHub (no longer) Works
holman
298
140k
A Modern Web Designer's Workflow
chriscoyier
689
180k
Infographics Made Easy
chrislema
235
17k
Designing Experiences People Love
moore
130
22k
Helping Users Find Their Own Way: Creating Modern Search Experiences
danielanewman
10
1.3k
Why You Should Never Use an ORM
jnunemaker
PRO
49
7.9k
Designing with Data
zakiwarfel
91
4.2k
The MySQL Ecosystem @ GitHub 2015
samlambert
240
11k
実際に使うSQLの書き方 徹底解説 / pgcon21j-tutorial
soudai
44
14k
Building a Scalable Design System with Sketch
lauravandoore
451
31k
Embracing the Ebb and Flow
colly
75
3.6k
Transcript
CLIでOAuth/OIDCを 快適に利用する Hidetake Iwata (@int128)
TL;DR CLI(コマンドラインツール)でOAuthやOpenID Connectを利用する場合、 ユーザは複雑なオペレーションが必要になる 一時的にHTTPサーバを立ち上げて認可コードを受け取ることで、 ユーザのオペレーションを軽減できる
Hidetake Iwata https://github.com/int128 Software Engineer at Tokyo ❤ DevOps, Agile,
CI/CD, Kubernetes, App Engine, Golang, Gradle, Groovy
CLIでOAuthやOpenID Connectを利用する場合、ユーザは複雑なオペレーションが必 要になる 1. ターミナルでコマンドを実行する 2. ターミナルに表示されたURLをブラウザで開く 3. Googleアカウントでログインする 4.
ブラウザに表示された認可コードをコピーする 5. ターミナルに認可コードをペーストする 6. コマンドの実行結果を見る OAuth/OIDC CLIの課題 https://developers.google.com/identity/protocols/OAuth2#installed
OAuth/OIDC CLIの例 $ ./upload_google_drive Open https://accounts.google.com/… Enter code: XXXXXXXXXXX... OK.
You are logged in as int128. ① ② ③ ④ ⑤ ⑥
Package golang.org/x/oauth2 config := &oauth2.Config{ ClientID: clientID, ClientSecret: clientSecret, Endpoint:
google.Endpoint, RedirectURL: "urn:ietf:wg:oauth:2.0:oob", } authCodeURL := config.AuthCodeURL(state) fmt.Printf("Open %s\nEnter code: ", authCodeURL) var code string _, err := fmt.Scanln(&code) token, err := config.Exchange(ctx, code) ② ⑤
OAuth/OIDC CLIのUX改善 ユーザのオペレーションを以下のように軽減したい 1. ターミナルでコマンドを実行する 2. ターミナルに表示されたURLをブラウザで開く 3. Googleアカウントでログインする 4.
ブラウザに表示された認可コードをコピーする 5. ターミナルに認可コードをペーストする 6. コマンドの実行結果を見る
OAuth/OIDC CLIのUX改善 ユーザのオペレーションを以下のように軽減したい 1. ターミナルでコマンドを実行する 2. (外部コマンドで自動的にブラウザを開く) 3. Googleアカウントでログインする 4.
(ローカルHTTPサーバにリダイレクトされる) 5. (ローカルHTTPサーバが認可コードを受け取る) 6. コマンドの実行結果を見る
ブラウザベースの認可コードフロー [1] https://developers.google.com/identity/protocols/OAuth2#webserver 一般的なWebアプリケーションと同様にリダイレクト で認可コードを受け取る 1. HTTPサーバを実行する 2. ブラウザで認可要求URLを開く 3.
http://localhost へのリダイレクトで認可コード を受け取る 4. HTTPサーバを終了する 5. 認可コードとトークンを交換する
codeCh := make(chan string) errCh := make(chan error) server :=
http.Server{":8080", &AuthCodeGrantHandler{ Callback: func(code string, err error) { switch { case err != nil: errCh <- err default: codeCh <- code } } }} go func() { if err := server.ListenAndServe(); err != nil && err != http.ErrServerClosed { errCh <- err } }() select { case err := <-errCh: server.Shutdown(ctx) return "", err case code := <-codeCh: server.Shutdown(ctx) return code, nil } HTTPサーバが認可コードを受け取っ たらチャネルに送信 ゴルーチンでHTTPサーバを実行 認可コードを受け取ったらHTTPサー バをシャットダウン
See Also 特定URLへのアクセスを契機としたHTTPサーバのGraceful Shutdown https://int128.hatenablog.com/entry/2018/03/28/232810 gpup: Upload files to your
Google Photos with the new Photos Library API https://github.com/int128/gpup kubelogin: kubectl with OpenID Connect authentication https://github.com/int128/kubelogin
まとめ コマンドラインツールでOAuthやOpenID Connectを利用する場合、 ユーザは認可コードの貼り付けなどの複雑なオペレーションが必要になる 一時的にHTTPサーバを立ち上げてリダイレクトで認可コードを受け取ることで、ユーザ のオペレーションを軽減できる GoのHTTPサーバ、チャネルやゴルーチンを組み合わせた実装を紹介した