OAuth
用語の理解
認証(Authentication)
ユーザーが誰なのかを証明すること
- ユーザー名とパスワードを入力させるログイン
- 指紋認証
- 多要素認証
認可(Authorization)
ユーザーの権限を管理すること
Google Cloud
Googleが開発者や企業向けに提供しているクラウドサービスの総称
Googleが自社サービスで使っている技術を、開発者がアプリに組み込めるように公開したプラットフォーム
Google Cloudで提供されている機能の例:
- GoogleサービスのAPI(Google Calendar API, Gmail API, Maps APIなど)
- ストレージ
- データベース
- 機械学習・AI
リダイレクトURI
OAuthフローで認可サーバーが認可コードを送る戻り先URL
OAuth(Open Authorizartion)
ユーザーが直接パスワードを渡さなくても、他のアプリに自分のデータへの「一部のアクセス権限」だけを安全に渡すための仕組み(フレームワーク)
RFCで標準化されており、特定の企業のサービスや技術ではなく、グローバルな標準仕様の技術。
「予約アプリがGoogleカレンダーの予定を読み書きしたい」場合を例にOAuthの理解を深める
OAuthがないと:
「ユーザーのGoogleアカウントのログイン情報をもらって予約アプリがGoogleカレンダーのデータを読み書き」
→ユーザーがGoogleのログイン情報を予約アプリに渡すのはセキュリティ的に問題。
OAuthがあると:
「自作アプリはユーザーのログイン情報を一切知らずにGoogleカレンダーのデータを読み書きできる」
OAuthフローの登場人物
-
クライアント
アクセスを求めるアプリ -
認可サーバー
アクセス許可の管理を行う -
リソースオーナー
データの所有者 -
リソースサーバー
データが保存されているサーバー
今回の例では、
クライアント:自作アプリ
認可サーバー:GoogleのOAuthサーバー
リソースオーナー:自作アプリのユーザー
リソースサーバー:Googleカレンダーのサーバー
OAuthフロー
- 予約アプリがGoogleの認可サーバーに、「Googleカレンダーのへのアクセスの許可」を求める
- Googleの認可サーバーは予約アプリのユーザーに、「予約アプリにユーザーのGoogleカレンダーを使わせてもいいか」を聞く
- ユーザーが許可する
- 認可サーバーが予約アプリの指定するリダイレクトURIに認可コードをつけて、リダイレクトする。
- 予約アプリはその認可コードを使って認可サーバーにアクセストークンのリクエストを送る
- 認可サーバーがアクセストークンを返す
- 予約アプリはそのトークンでGoogleカレンダーにアクセス
認可コードグラントの全体像
1. 認可グラントタイプとは
クライアントがアクセストークンを取得するまでの仕組み、流れの種類
グラント:grant(許可、付与、与えること)
2. 認可コードグラントとその仕組み
最も代表的で安全性の高い認可グランドタイプ。一時的な認可コードを介して、アクセストークンを取得する2段階構成の認証フロー。コンフィデンシャルクライアント向けに設計されている。
3.なぜ安全か
- 認可コードの有効期限が短く、使い捨て
- アクセストークンはサーバー側で取得するため外部に漏れづらい
バックエンドで保持、管理されたデータは外部からのアクセスを厳しく制限できるため覗き見することが難しい
4.クライアントの種類と適した認可グラントタイプ
クライアントの種類
クライアントが秘匿情報(クライアントシークレットやアクセストークンなど)を安全に管理できるかで区別される
-
コンフィデンシャルクライアント(機密クライアント)
バックエンドのWebアプリなど、サーバーサイドで動作し、機密情報を安全に管理できるクライアント
適したグラントタイプ:認可コードグラント -
パブリッククライアント(公開クライアント)
JavaScriptアプリ、スマホアプリなど、機密情報を秘匿できない環境で動作するクライアント
適したグラントタイプ:認証コードグラント+「PKCE(ピクシー)」
自作アプリからGoogleカレンダーの予定を読み書きしたい
Google Cloudにアプリケーションの登録を行う
1. Google Cloud Consoleにアクセス
Googleが提供している開発者のための管理画面
2. プロジェクトを作成
アプリの設定をまとめる単位を作る
3. 作成したプロジェクトでGoogle Calender APIを有効にする
使いたいAPIを有効にする
4. OAuth同意画面の設定
ユーザーに対して「どんな機能を使うか、誰に使わせるか」を説明するための設定。ここで設定した内容はユーザーがOAuthフローで許可するときにそのまま表示される。
- アプリ情報を入力
- アプリ名
- サポートメール
- 開発元情報
- アプリのロゴ(任意)
- スコープの設定
アプリがGoogleのどの機能にアクセスしたいのかを指定 - テストユーザーの登録
開発中のアプリでは、自分の Gmailアドレス を登録することでOAuth認証フローを自分で試せる
5. OAuthクライアントIDを作成する(認証情報の作成)
- GoogleのOAuthサーバーが個々のアプリ(クライアント)を識別するための身分証明書を作成。この身分証明書でGoogle側はどのアプリからのリクエストかを識別し、アプリに認可リクエストをさせていいかどうかを判定。
- アプリの種類を選ぶ
- リダイレクトURIを設定
クライアントIDとクライアントシークレットが発行される
6. 認証情報(JSON)をダウンロード
コードからOAuth認証を開始するのに使う設定ファイルが手に入る
Discussion