OAuth 2.0 とは
OAuth 2.0 は、認可(Authorization)のためのプロトコルです。これは、ユーザーが第三者のアプリケーションに自身のリソースへのアクセス権を与えるための仕組みです。
例えば、あるアプリがユーザーの Google Drive に保存されたファイルを読み取る許可を得たい場合、OAuth 2.0 を利用すると、ユーザーが Google に対して明示的に許可を与えることで、そのアプリが Google Drive のデータにアクセスできるようになります。
OAuth 2.0 は、以下の 4 つの主要なロールを持っています。
- リソースオーナー(Resource Owner) - 一般的にはユーザーであり、リソースへのアクセス権を持っている。
- クライアント(Client) - アクセスを要求するアプリケーション。
- 認可サーバー(Authorization Server) - ユーザー認証を行い、適切なアクセストークンを発行する。
- リソースサーバー(Resource Server) - クライアントがアクセスしたい API を提供するサーバー。
OAuth 2.0 のフローの一例として「認可コードフロー(Authorization Code Flow)」を見てみましょう。
import requests # 認可コードを取得(ユーザーがブラウザで認可した後のリダイレクトURLに含まれる) authorization_code = "example_code" # アクセストークンを取得 TOKEN_URL = "https://example.com/oauth/token" CLIENT_ID = "your_client_id" CLIENT_SECRET = "your_client_secret" REDIRECT_URI = "https://yourapp.com/callback" response = requests.post(TOKEN_URL, data={ "grant_type": "authorization_code", "code": authorization_code, "redirect_uri": REDIRECT_URI, "client_id": CLIENT_ID, "client_secret": CLIENT_SECRET }) token_data = response.json() access_token = token_data.get("access_token") print("Access Token:", access_token)
このように、OAuth 2.0 はユーザーの認証(Authentication)ではなく、認可(Authorization) に焦点を当てています。
OIDC(OpenID Connect)とは
OIDC(OpenID Connect)は、OAuth 2.0 を拡張して「認証(Authentication)」の仕組みを提供するプロトコルです。
OAuth 2.0 の問題点の一つとして、取得したアクセストークンが「そのユーザーのもの」であることを保証する仕組みがないことが挙げられます。OIDC では、ID トークン(ID Token)と呼ばれる JSON Web Token(JWT)を利用することで、ユーザーの認証情報をやり取りできるようになっています。
OIDC の基本的なフローは OAuth 2.0 に似ていますが、認可サーバーがアクセストークンと一緒に ID トークンを発行する点が異なります。
以下は、OIDC を用いた ID トークンの取得例です。
import jwt import requests # OIDC 認可コードから ID トークンを取得 TOKEN_URL = "https://example.com/oauth/token" authorization_code = "example_code" response = requests.post(TOKEN_URL, data={ "grant_type": "authorization_code", "code": authorization_code, "redirect_uri": REDIRECT_URI, "client_id": CLIENT_ID, "client_secret": CLIENT_SECRET, "scope": "openid profile email" }) token_data = response.json() id_token = token_data.get("id_token") # ID トークンのデコード(公開鍵を用いて検証するのが推奨) decoded_token = jwt.decode(id_token, options={"verify_signature": False}) print("User Info:", decoded_token)
ID トークンをデコードすると、以下のような情報が得られます。
{ "iss": "https://example.com", "sub": "1234567890", "aud": "your_client_id", "exp": 1712345678, "iat": 1712341234, "email": "user@example.com", "name": "John Doe" }
OIDC を使うことで、「このアクセストークンの持ち主は誰なのか?」を簡単に確認できるようになります。
OAuth 2.0 と OIDC の違い
| 比較項目 | OAuth 2.0 | OIDC |
|---|---|---|
| 主な目的 | 認可(Authorization) | 認証(Authentication)+認可 |
| トークンの種類 | アクセストークン(Access Token) | アクセストークン + ID トークン(ID Token) |
| ユーザー情報 | アクセストークンのみでは分からない | ID トークンを通じて取得可能 |
| 用途 | API への安全なアクセス管理 | ユーザーの認証と情報取得 |
OAuth 2.0 は「誰がアクセスしているか」を保証しないため、認証にそのまま利用するのは危険です。一方で、OIDC は認証のために設計されているため、安全にユーザーを識別できます。
まとめ
OAuth 2.0 は「認可」に特化したプロトコルであり、認証には向いていません。OIDC は OAuth 2.0 を拡張して「認証」を提供し、安全にユーザー情報を取得できる仕組みを持っています。
そのため、「API にアクセス権を与えるだけなら OAuth 2.0」「ログイン認証が必要なら OIDC」と使い分けるのが一般的です。
実際の開発では、Google や Microsoft などの ID プロバイダーが提供する OIDC を利用することで、より安全な認証を実現できます。