🙇‍♂️

GoでOpen ID Connect(OIDC)を使ってGoogleの認証を利用する

2023/04/01に公開

Webアプリ利用時に独自の認証機能ではなくGoogleの認証機能を利用してOpen ID Connectのサンプルを試します。サンプルアプリは以下です。
https://github.com/coreos/go-oidc

まずはGoogleのWeb画面から同意画面に表示するアプリ名やリダイレクト先のURLを記載する
https://console.cloud.google.com/apis/dashboard

ローカルで動かすため以下のように記入する
Authorized JavaScript origins http://127.0.0.1:5556
Authorized redirect URIs http://127.0.0.1:5556/auth/google/callback

認証情報を作成後クライアントIDとシークレットが表示されるので環境変数に定義する

export GOOGLE_OAUTH2_CLIENT_ID=・・・
export GOOGLE_OAUTH2_CLIENT_SECRET=・・・

サンプルアプリを起動する

$ go run example/idtoken/app.go 

ブラウザでリクエストを投げる
http://127.0.0.1:5556/

認証画面

認証が通ったらユーザーの情報を取得できます

{
    "OAuth2Token": {
        "access_token": "*REDACTED*",
        "token_type": "Bearer",
        "expiry": "2023-04-01T21:56:59.749715+09:00"
    },
    "IDTokenClaims": {
        ・・・
        "sub": "ユーザーごとに一意のID",
        "email": "kai.kusakari@gmail.com",
        "email_verified": true,
        "at_hash": "ハッシュ値",
        "nonce": "",
        "name": "草苅快",
        "picture": "https://lh3.googleusercontent.com/a/AGNmyxbCoxz43_Pq5JLtkMPj7sL4Iun8cDOx2s8yvi6N=s96-c",
        "given_name": "快",
        "family_name": "草苅",
	・・・
    }
}

レスポンスを受け取り、subの値をDBに登録しておくことで次回以降このユーザーが再度ログインしてきた際にはsubの文字列が登録済みかどうか?確認することで新規ユーザーの初回ログインなのか、既存ユーザーの再ログインなのか?判断します。 WebアプリであればアクセストークンをHTTPヘッダに使うのはリスクもあるので、OIDCでは認証のみ確認して、以降のセッションは個別にCookieを発行して独自管理するのが一番良いと感じています。

Discussion