前回に引き続き認証のことを書いていきたいと思います。
前回の記事はこちらです。
OpenID Connectとは
OAuth2.0では認可だけを扱っていたのを認証もさせるようにした仕組みのことを指します。そのため、OpenID Connect はOAuth2.0の拡張版と言ってよさそうです。
OAuth2.0との違い
上記でも少し触れましたが、認証の部分が差分になります。具体的には、OpenID Connectではアクセストークンと同時にID トークンを返すようになります。
go-oidcを使ったサンプル実装
上記でOpenID Connectの仕組みは理解できたと思うので、実際に動かして見ます。今回は go-oidcというパッケージを使用したいと思います。
設定
READMEに記載しているとおりに設定します。
- サイドバーの「OAuth同意画面」でアプリ情報を登録する
- サイドバーの「認証情報」から「OAuth クライアントID」を作成する
実装
下記のサンプル実装を見ていきたいと思います。
実装されているエンドポイントは、認可エンドポイントとトークン発行のエンドポイントになります。
設定で、「承認済みの JavaScript 生成元」と「承認済みのリダイレクト URI」を設定したと思いますが、それぞれが認可エンドポイント、トークン発行のエンドポイントになっていることがわかります。
認可エンドポイント
認可エンドポイントでは、URLをリダイレクトさせているだけになります。リダイレクト先は、Googleの認証画面になります。
http.Redirect(w, r, config.AuthCodeURL(state, oidc.Nonce(nonce)), http.StatusFound)
トークン発行エンドポイント
ユーザーが認証したら認可コードを使用し、IDトークンとAccessTokenを取得します。
rawIDToken, ok := oauth2Token.Extra("id_token").(string)
if !ok {
http.Error(w, "No id_token field in oauth2 token.", http.StatusInternalServerError)
return
}
idToken, err := verifier.Verify(ctx, rawIDToken)
if err != nil {
http.Error(w, "Failed to verify ID Token: "+err.Error(), http.StatusInternalServerError)
return
}
パラメータについて
state
クロスサイトリクエストフォージェリ(CSRF)対策のために使用されます。
nonce
リプレイアタック対策のために使用します。
PKCE(ピクシー)
認可コード横取り攻撃を防ぐためのものです。
SSOとの違い
SSO(シングルサインオン)は、このOPenID Connectを内部的に使っているという理解でいます。