Google OAuth2.0 の調査結果。
OAuth2.0を使用してGoogleの認証を行う際のシーケンスは、以下のような手順で行われる。
-
クライアントの登録
最初に、Google Developers Consoleでアプリケーションを登録し、クライアントIDとクライアントシークレットを取得する。 -
ユーザーの認証の開始(リクエスト)
クライアントアプリケーションは、Googleの認証サーバーに対して認証リクエストを送信する。リクエストには以下の情報が含まれる。- 必要なスコープ(アクセス権限)の指定
- クライアントID
- リダイレクトURI(認証後にユーザーをリダイレクトするURI)(※ユーザーのログインの数だけURLが違う)
-
ユーザーの認証ページへのリダイレクト(GoogleのUI)
Googleの認証サーバーは、認証ページへのリダイレクトを返す。ユーザーはGoogleの認証ページでログインし、アプリケーションにアクセスを許可する。 -
認証コードの取得(レスポンス)
ユーザーがアクセスを許可すると、Googleの認証サーバーは指定されたリダイレクトURIに認証コードを返す。この認証コードは、アクセストークンを取得するために使用される。 -
アクセストークンの取得(リクエスト、レスポンス)
クライアントアプリケーションは、取得した認証コードとクライアントシークレットを使用して、アクセストークンをGoogleのトークンエンドポイントから要求する。 -
アクセストークンの利用
クライアントアプリケーションは、取得したアクセストークンを使用して、GoogleAPIにリクエストを送信する。アクセストークンは、APIへのアクセス権限を示す。
OAuth2.0プロトコルにはさまざまなフローがあり、利用ケースに応じて適切なフローを選択する必要がある。
sequenceDiagram
participant USER as ユーザー
participant UAGE as ユーザーエージェント<br>(ブラウザ)
participant APSV as アプリケーション<br>サーバー
participant OASV as OAuth認証<br>サーバー
participant RSSV as リソース<br>サーバー
OASV ->> OASV: register client ※1
USER ->> UAGE: request resource
UAGE ->> APSV: request resource
APSV ->> APSV: build authorization url
APSV -->> UAGE: authorization url
UAGE ->> OASV: redirect to authorization url ※2
OASV -->> UAGE: present approval form ※3
UAGE -->> USER: present approval form
USER ->> UAGE: approve
UAGE ->> OASV: post approval ※4
OASV -->> UAGE: autorization code
UAGE ->> APSV: redirect to callback url<br>autorization code
APSV ->> OASV: request access token<br>(exchange) ※5
OASV -->> APSV: access token
APSV ->> RSSV: request resource ※6
RSSV -->> APSV: resource
APSV -->> UAGE: resource
UAGE -->> USER: resource
# play groundより取得
https://accounts.google.com/o/oauth2/v2/auth/oauthchooseaccount
?redirect_uri=https%3A%2F%2Fdevelopers.google.com%2Foauthplayground
&prompt=consent
&response_type=code
&client_id=407408718192.apps.googleusercontent.com
&scope=openid
&access_type=offline
&service=lso
&o2v=2
&theme=mn
&ddm=0
&flowName=GeneralOAuthFlow
Google OAuth2 API v2だと以下が存在する。
- https://www.googleapis.com/auth/userinfo.email
- https://www.googleapis.com/auth/userinfo.profile
- openid(認証したいだけならこれだけで良いのかな...?)
%20(スペースのurlencode)で区切って複数指定可能。
access_type=offline パラメータは、OAuth 2.0の認証フローにおいて、refresh tokenを取得するための指定。
長期間にわたってユーザーのデータにアクセスし続けるアプリケーションや、バッチ処理などで利用される。
# request header
Authorization: Bearer {access token}
凡そ以下の通り。
- token検証endpoint(※googleにはない)で検証
- resource serverに投げてresponse statusが200であること
- expire dateを過ぎていないこと
googleの場合、token refresh endpointに以下をpostする。
- client_id: クライアントID
- client_secret: クライアントシークレット
- refresh_token: リフレッシュトークン
- grant_type: refresh_token(リフレッシュトークンを使用して新しいアクセストークンを取得することを示す)
refresh tokenはサーバで保持する。
Google OAuth2 API v2のscope(前述)を全指定した上で、取得できる項目は以下の通り。
https://www.googleapis.com/userinfo/v2/me
{
"family_name": "xxx",
"name": "xxx",
"picture": "https://lh3.googleusercontent.com/a/xxx",
"locale": "ja",
"email": "[email protected]",
"given_name": "xxx",
"id": "xxx",
"verified_email": true
}
data-platform-api-google-account-user-info-requests-rmq-kube は、周辺システム を データ連携基盤 と統合することを目的に、API でSMS認証トークンデータを生成するマイクロサービスです。
data-platform-api-google-account-user-info-requests-rmq-kube の動作環境は、次の通りです。
・ OS: LinuxOS (必須)
・ CPU: ARM/AMD/Intel(いずれか必須)
data-platform-api-google-account-user-info-requests-rmq-kube が対応する APIサービス は、次のものです。
data-platform-api-google-account-user-info-requests-rmq-kube には、次の API をコールするためのリソースが含まれています。
- A_SMSAuthToken(SMS認証トークン - 入力データ)
data-platform-api-google-account-user-info-requests-rmq-kube において、API への値入力条件の初期値は、入力ファイルレイアウトの種別毎に、次の通りとなっています。
Latona および AION の データ連携基盤 関連リソースでは、Inputs フォルダ下の sample.json の accepter に取得したいデータの種別(=APIの種別)を入力し、指定することができます。
なお、同 accepter にAll(もしくは空白)の値を入力することで、全データ(=全APIの種別)をまとめて取得することができます。
- sample.jsonの記載例(1)
accepter において 下記の例のように、データの種別(=APIの種別)を指定します。
ここでは、"SMSAuthToken" が指定されています。
"api_schema": "DPFMSMSAuthenticatinTokenGenerates",
"accepter": ["SMSAuthToken"],
- 全データを取得する際のsample.jsonの記載例(2)
全データを取得する場合、sample.json は以下のように記載します。
"api_schema": "DPFMSMSAuthenticatinTokenGenerates",
"accepter": ["All"],
accepter における データ種別 の指定に基づいて DPFM_API_Caller 内の caller.go で API がコールされます。
caller.go の func() 毎 の 以下の箇所が、指定された API をコールするソースコードです。
func (c *DPFMAPICaller) AsyncCreates(
accepter []string,
input *dpfm_api_input_reader.SDC,
log *logger.Logger,
) []error {
wg := sync.WaitGroup{}
mtx := sync.Mutex{}
errs := make([]error, 0, 5)
exconfAllExist := false
subFuncFin := make(chan error)
exconfFin := make(chan error)
wg.Add(1)
go func() {
defer wg.Done()
var e []error
exconfAllExist, e = c.confirmor.Conf(input, log)
if len(e) != 0 {
mtx.Lock()
errs = append(errs, e...)
mtx.Unlock()
exconfFin <- xerrors.Errorf("exconf error")
return
}
exconfFin <- nil
}()
for _, fn := range accepter {
wg.Add(1)
switch fn {
case "Header":
go c.headerCreate(&wg, &mtx, subFuncFin, log, errs, input)
case "Item":
errs = append(errs, xerrors.Errorf("accepter Item is not implement yet"))
default:
wg.Done()
}
}
本マイクロサービスでは、golang-logging-library-for-data-platform により、以下のようなデータがJSON形式で出力されます。
以下の sample.json の例は SMS認証トークン の SMS認証トークンデータ が生成された結果の JSON の例です。
以下の項目のうち、"UserID" ~ "AuthenticationCode" は、/DPFM_API_Output_Formatter/type.go 内 の Type SMSAuthToken {} による出力結果です。"cursor" ~ "time"は、golang-logging-library による 定型フォーマットの出力結果です。
XXX