OpenID Connect 入門:概要と基本的なフロー解説
はじめに
OpenID Connect(OIDC)は、OAuth 2.0 をベースにした認証用の拡張仕様です。OAuth 2.0 が「認可」にフォーカスしているのに対して、OIDC は「認証」を扱うための仕組みを追加しています。
本記事では、OIDC の基礎的な部分を把握したい方向けに、概要や構成要素、代表的なフローについて解説します。
OIDC とは?
OIDC は、OpenID Foundation が策定した「エンドユーザーの認証」にフォーカスした仕様です。OAuth 2.0 を拡張し、ID Token という新たなトークンを導入してユーザー情報をやり取りできます。ユーザー認証基盤を共通化することで、エンドユーザーにとっては「Google アカウントでログイン」「GitHub アカウントでログイン」などのシングルサインオン(SSO)を実現しやすくなります。
OAuth 2.0 との関係性
- OAuth 2.0 : リソースアクセスの権限付与(認可)を行うプロトコル。
- OIDC : 上記 OAuth 2.0 をベースとして、ユーザーの認証に使える仕組みを標準化した仕様。ID Token を導入。
主な導入メリット
-
認証基盤の共通化
Google などの既存プロバイダを利用することで、各サイトやサービスで独自の認証機能を構築せずに済む。 -
セキュリティ向上
ID Token の署名検証など、標準化された手順でセキュアにユーザー認証が行える。 -
ユーザビリティの向上
ユーザーは複数のサービスでアカウントを使い分ける必要がなく、一つのアカウントでログインが可能。
OIDC の主要要素
OIDC で登場する重要なエンティティや概念を押さえておきましょう。
-
Issuer (OpenID Provider, OP)
- ID Token を発行する認証サーバー側のサービス。Google や GitHub、Auth0 など。
-
Relying Party (RP)
- OP から認証結果を受け取り、ログイン処理を行うクライアント(サービス提供側)。
-
ID Token
- JWT(JSON Web Token)形式で、ユーザーを認証したことを示すトークン。
sub
(ユーザーを一意に識別するクレーム)や発行者情報 (iss
) などが含まれる。
- JWT(JSON Web Token)形式で、ユーザーを認証したことを示すトークン。
-
UserInfo エンドポイント
- ユーザーのプロフィール情報を取得するためのエンドポイント。
ID Token に含まれない追加情報などを取得するために使用。
- ユーザーのプロフィール情報を取得するためのエンドポイント。
フロー概要
OIDC には複数のフロー(Authorization Code Flow、Implicit Flow、Hybrid Flow、など)がありますが、その中でも現在最も広く使われている Authorization Code Flow with PKCE(Proof Key for Code Exchange)を中心に解説します。
Authorization Code Flow (with PKCE)
-
認可リクエスト
Relying Party (RP) から OpenID Provider (OP) にユーザーをリダイレクトする。
このとき、scope=openid
(必須)やresponse_type=code
、client_id
、redirect_uri
、state
、code_challenge
(PKCE を使う場合)などのパラメータを付与する。 -
ユーザー認証
OP 側でユーザーにログインを要求。成功したら、認可コード(Authorization Code)が付与される。 -
トークンエンドポイントへのリクエスト
RP は付与された認可コードを使ってトークンエンドポイントへアクセストークン (Access Token) および ID Token をリクエストする。PKCE を使っている場合、code_verifier
を送信し、code_challenge
との整合性を確認してもらう。 -
トークン受け取り
OP はリクエストを検証後、RP にアクセストークンと ID Token(必要があればリフレッシュトークンも)を返却する。 -
ユーザー情報の取得 (任意)
RP はアクセストークンを用いて、UserInfo エンドポイントにアクセスし、追加のユーザープロフィールなどを取得する。
フロー図イメージ
実装のポイント
-
HTTPS を必須とする
トークン受け渡しなどを行うため、通信は常に TLS(HTTPS)で保護されている必要があります。 - state や nonce の利用
-
ID Token の検証
- JWT の署名検証(公開鍵を用いた署名検証)
-
iss
が想定されたドメインか確認 -
aud
が自分のクライアント ID か確認 -
exp
の有効期限チェック
-
UserInfo エンドポイントの利用
- ID Token に含まれないユーザープロフィールが必要な場合は、返却されたアクセストークンで取得する。
- アクセストークンのスコープに応じて取得できる情報が決まる。
実装例(簡易コード)
以下は Node.js (Express) の例をイメージした非常に簡易的なサンプルです。(実際の実装ではライブラリやセキュリティ設定を十分に考慮してください)
// npm install express passport passport-openidconnect
const express = require("express");
const passport = require("passport");
const { Strategy: OpenIDConnectStrategy } = require("passport-openidconnect");
passport.use(
new OpenIDConnectStrategy(
{
issuer: "https://example.com/", // OP(Authorization Server)のIssuer
authorizationURL: "https://example.com/oauth2/authorize",
tokenURL: "https://example.com/oauth2/token",
userInfoURL: "https://example.com/oauth2/userinfo",
clientID: "YOUR_CLIENT_ID",
clientSecret: "YOUR_CLIENT_SECRET",
callbackURL: "http://localhost:3000/callback",
scope: ["openid", "profile", "email"],
},
(issuer, sub, profile, accessToken, refreshToken, done) => {
// ユーザー情報をセッションに保存など
return done(null, profile);
}
)
);
const app = express();
// ログイン開始(OIDC プロバイダにリダイレクト)
app.get("/auth", passport.authenticate("openidconnect"));
// リダイレクト後のコールバック
app.get(
"/callback",
passport.authenticate("openidconnect", {
failureRedirect: "/error",
successRedirect: "/",
})
);
app.get("/", (req, res) => {
res.send("ログイン完了!");
});
app.listen(3000, () => console.log("Server started on http://localhost:3000"));
まとめ
OIDC は OAuth 2.0 を拡張し、認可だけでなく認証も行いたいケースに適した仕様です。
ID Token によりユーザーを安全に認証でき、既存の大手プロバイダが提供しているため導入が容易というメリットがあります。
実装する際は PKCE を有効にし、ID Token の検証を正しく行うなどセキュリティ面に配慮することが重要です。
より詳細な仕様については、公式ドキュメント をご覧ください。
Discussion