『いまどきの OAuth / OpenID Connect (OIDC) 一挙おさらい』の予習・復習用情報

# はじめに

**[Authlete](https://www.authlete.com/)**（オースリート）社主催の勉強会『**いまどきの OAuth / OpenID Connect (OIDC) 一挙おさらい**』（[2020 年 1 月 31 日](https://authlete.connpass.com/event/162296/)（済）, [2020 年 2 月 21 日](https://authlete.connpass.com/event/163994/)（中止））の内容がてんこ盛り過ぎるため、予習・復習用の情報を書き出そうと思います。

### 追記
**2020 年 1 月 31 日の勉強会の資料と動画（字幕付き）を[公開](https://www.authlete.com/ja/resources/videos/20200131/)しました！**

# OAuth / OIDC

勉強会参加者は、**OAuth 2.0**（オーオース）と **OpenID Connect**（オープンアイディー・コネクト）の基本を知っていることが前提となります。

**OAuth 2.0 は「アクセストークンを発行する仕組み」**です。その中心となる仕様は **[RFC 6749](https://tools.ietf.org/html/rfc6749 "The OAuth 2.0 Authorization Framework")** です。詳細については『[一番分かりやすい OAuth の説明](https://qiita.com/TakahikoKawasaki/items/e37caf50776e00e733be)』と『[OAuth 2.0 全フローの図解と動画](https://qiita.com/TakahikoKawasaki/items/200951e5b5929f840a1f)』をご参照ください。

![39.png](https://qiita-image-store.s3.amazonaws.com/0/106044/f8dc0cca-15c1-569d-c6e4-2055ea8c97cb.png)

**OpenID Connect は「ID トークンを発行する仕組み」**です。その中心となる仕様は **[OpenID Connect Core 1.0](https://openid.net/specs/openid-connect-core-1_0.html)** です。詳細については『[一番分かりやすい OpenID Connect の説明](https://qiita.com/TakahikoKawasaki/items/498ca08bbfcc341691fe)』と『[OpenID Connect 全フロー解説](https://qiita.com/TakahikoKawasaki/items/4ee9b55db9f7ef352b47)』をご参照ください。

![27.png](https://qiita-image-store.s3.amazonaws.com/0/106044/7a166374-ee5f-e992-bc63-b860ee22b68b.png)


# PKCE / JWT

勉強会の案内文に次のように書かれている通り、

> _今回の勉強会では、主に「**ポスト PKCE / JWT（2015 年以降）**」を中心に、Authlete 社の独断と偏見により、2020 年に注目すべき OAuth 2.0 / OIDC 関連仕様とプラクティスをご紹介します。_

2015 年に RFC 化された **PKCE**（ピクシー；[RFC 7636](https://tools.ietf.org/html/rfc7636 "Proof Key for Code Exchange by OAuth Public Clients")）や **JWT**（ジョット；[RFC 7519](https://tools.ietf.org/html/rfc7519 "JSON Web Token (JWT)")）は、2020 年の今となっては常識扱いされています。

**PKCE は「認可リクエストの送信元とトークンリクエストの送信元が同一であることを認可サーバー側で確認するための仕組み」**で、セキュリティ上必須級とみなされています。詳細については『[PKCE: 認可コード横取り攻撃対策のために OAuth サーバーとクライアントが実装すべきこと](https://qiita.com/TakahikoKawasaki/items/00f333c72ed96c4da659)』をご参照ください。

![PKCE-basic-idea.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/106044/ab111880-c389-ef7b-a55d-1bace3f20e47.png)


**JWT は「署名 and/or 暗号化された JSON データ」**です。JWT は OAuth / OIDC の様々な場所で使われているため、JWT を理解していないと詰んでしまいます。詳細については『[IDトークンが分かれば OpenID Connect が分かる](https://qiita.com/TakahikoKawasaki/items/8f0e422c7edd2d220e06)』をご参照ください。

![nested-jwt.png](https://qiita-image-store.s3.amazonaws.com/0/106044/479f3b7e-aa12-7878-393a-80f2871bd893.png)


# BCP

OAuth / OIDC を実装する際のセキュリティ上のベストプラクティスが **[OAuth 2.0 Security Best Current Practice](https://datatracker.ietf.org/doc/draft-ietf-oauth-security-topics/)**（通称 **BCP**）という文書にまとめられています。

同文書には、アクセストークンの対象リソースを制限する仕組みである **[Resource Indicators for OAuth 2.0](https://datatracker.ietf.org/doc/draft-ietf-oauth-resource-indicators/?include_text=1)**（[解説記事](https://qiita.com/TakahikoKawasaki/items/57d6242ff8b20dbff08f "Resource Indicators for OAuth 2.0")）や、`tls_client_auth` や `private_key_jwt` などの非対称鍵系クライアント認証方式（[解説記事](https://qiita.com/TakahikoKawasaki/items/63ed4a9d8d6e5109e401 "OAuth 2.0 クライアント認証")）、クライアント証明書とアクセストークンを紐づける仕組みである **[OAuth 2.0 Mutual TLS Client Authentication and Certificate Bound Access Tokens](https://datatracker.ietf.org/doc/draft-ietf-oauth-mtls/?include_text=1)**（通称 **MTLS**）（[図解](https://speakerdeck.com/takahikokawasaki/financial-grade-api-fapi-and-ciba-iiw-fall-2019?slide=21)）などへの言及が含まれています。


# FAPI

より高いセキュリティのための要求事項をまとめた **Financial-grade API**（通称 **FAPI**；ファピ）の実装者向けドラフト第 2 版が 2018 年 10 月に[承認](https://openid.net/2018/10/24/implementers-drafts-of-three-fapi-specifications-approved/)されました。

認可リクエストの詐称・改竄防止のための**リクエストオブジェクト**（[紹介記事](https://qiita.com/TakahikoKawasaki/items/185d34814eb9f7ac7ef3#24-%E3%83%AA%E3%82%AF%E3%82%A8%E3%82%B9%E3%83%88%E3%82%AA%E3%83%96%E3%82%B8%E3%82%A7%E3%82%AF%E3%83%88)）、認可レスポンスの詐称・改竄防止のための [ID Token as Detached Signature](https://openid.net/specs/openid-financial-api-part-2-ID2.html#introduction) / **[Financial-grade API: JWT Secured Authorization Response Mode for OAuth 2.0 (JARM)](https://openid.net/specs/openid-financial-api-jarm.html)**（[解説記事](https://qiita.com/TakahikoKawasaki/items/8567c80528da43c7e844#jwt-secured-authorization-response-mode "OAuth 2.0 の認可レスポンスとリダイレクトに関する説明")）、などの様々なセキュリティ向上策（[リスト](https://speakerdeck.com/takahikokawasaki/financial-grade-api-fapi-and-ciba-iiw-fall-2019?slide=9)）が含まれています。

FAPI の詳細については『[世界最先端の API セキュリティー技術、実装者による『FAPI（Financial-grade API）』解説](https://qiita.com/TakahikoKawasaki/items/83c47c9830097dba2744)』をご参照ください。


# PAR / RAR

認可要求内容の詳細化（例：単なる「送金権限」ではなく「○○円を△△に送金する権限」）に対応するため、[英国 Open Banking](https://www.openbanking.org.uk/) は **Lodging Intent Pattern** というものを考案しました。Lodging Intent Pattern では、認可リクエストを投げる前に認可要求内容を事前にサーバーに登録し、その登録内容に対応する Intent ID の発行を受け、続いて投げる認可リクエストにその Intent ID を含める、といった手順を踏みます。これにより、（Web ブラウザを介して投げられる）認可リクエストが巨大化することや、認可リクエストに個人特定情報などの繊細な情報が含まれることを防ぐことができます。

この Lodging Intent Pattern を汎用的な仕組みとして標準化すべく、**[OAuth 2.0 Pushed Authorization Requests](https://tools.ietf.org/html/draft-ietf-oauth-par)**（通称 **PAR**；パー）と **[OAuth 2.0 Rich Authorization Requests](https://datatracker.ietf.org/doc/draft-ietf-oauth-rar/?include_text=1)**（通称 **RAR**；ラー）の仕様策定が進められています。

**PAR は「認可リクエストを事前に認可サーバーに登録する仕組み」**です。PAR をサポートする認可サーバーは **Pushed Authorization Request Endpoint** というエンドポイントを提供します。詳細については『[図解 PAR : OAuth 2.0 Pushed Authorization Requests](https://qiita.com/TakahikoKawasaki/items/97563be46b62a0e02fe6)』をご参照ください。

![par_ja.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/106044/5ffd2c20-b275-8e7e-e337-d10643db65b7.png)

**RAR は「認可リクエストに詳細情報を含めるための仕組み」**です。RAR をサポートする認可サーバーは `authorization_details` というリクエストパラメーターを解釈します。


# Device Flow / CIBA

伝統的なリダイレクトに基づくフロー（[解説記事](https://qiita.com/TakahikoKawasaki/items/8567c80528da43c7e844 "OAuth 2.0 の認可レスポンスとリダイレクトに関する説明")）とは異なるフローとして、**デバイスフロー**（[RFC 8628](https://tools.ietf.org/html/rfc8628 "OAuth 2.0 Device Authorization Grant")）や **CIBA**（シーバ）が新たに定義されました。

デバイスフローをサポートする認可サーバーは**デバイス認可エンドポイント**というエンドポイントを提供します。デバイスフローは、（認可エンドポイントではなく）デバイス認可エンドポイントにリクエストを投げるところから開始します。詳細については『[図解デバイスフロー（RFC 8628）](https://qiita.com/TakahikoKawasaki/items/78eff94cef92741131f0)』をご参照ください。

CIBA をサポートする認可サーバーは**バックチャネル認証エンドポイント**というエンドポイントを提供します。CIBA フローは、（認可エンドポイントではなく）バックチャネル認証エンドポイントにリクエストを投げるところから開始します。詳細については『[世界最先端の認証認可技術、実装者による『CIBA』解説](https://qiita.com/TakahikoKawasaki/items/9b9616b999d4ce959ba3)』をご参照ください。また、CIBA の実装方法については『[Authlete を使って CIBA 対応の認可サーバーを作る](https://qiita.com/hidebike712/items/8fc2938055d0b49cfc0a)』をご参照ください。

![CIBA-concept.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/106044/86c81ccc-fc1b-b7ed-ce41-8330750b817d.png)
<sup>↑ CIBA の概念図</sup>


# IDA

運転免許証や健康保険証などを本人確認書類として用い、物理的な対面などで本人確認をし、その結果得られた氏名や住所などの情報があるとします。その情報を、**本人確認書類や本人確認方法の情報と併せて**提供することが求められる場合があります。その提供方法を標準化したものが、**[OpenID Connect for Identity Assurance 1.0](https://openid.net/specs/openid-connect-4-identity-assurance-1_0.html)**（通称 **IDA**）です。IDA は、本人確認、いわゆる **KYC**（Know Your Customer）が求められるシーンでの活用が期待される技術仕様です。詳細については『[Identity Assurance - eKYC 時代の OpenID Connect](https://qiita.com/TakahikoKawasaki/items/55b54d4b09826a9605e5)』をご参照ください。

```json
{
  "email": "max@example.com",
  "verified_claims": {
    "verification": {
      "trust_framework": "de_aml",
      "time": "2012-04-23T18:25:43+01",
      "verification_process": "676q3636461467647q8498785747q487",
      "evidence": [
        {
          "type": "id_document",
          "method": "pipp",
          "document": {
            "type": "idcard",
            "issuer": {
              "name": "Stadt Augsburg",
              "country": "DE"
            },
            "number": "53554554",
            "date_of_issuance": "2012-04-23",
            "date_of_expiry": "2022-04-22"
          }
        }
      ]
    },
    "claims": {
      "given_name": "Max",
      "family_name": "Meier",
      "birthdate": "1956-01-28"
    }
  },
  "iss": "https://authlete.com",
  "sub": "1003",
  "aud": [
    "213488672826"
  ],
  "exp": 1580982513,
  "iat": 1580896113,
  "auth_time": 1580896112,
  "nonce": "mynonce",
  "at_hash": "J780SH6dR2lHc0ivg6PAnA",
  "c_hash": "KpIgI65bQORt526n1tOrng",
  "s_hash": "w2g5TwGcVl39IiV2dzcn5w"
}
```

<sup>↑ IDA で定義される `verified_claims` を含む ID トークンのペイロード部の例</sup>


# おわりに

2020 年 2 月 2 日の夜、**共用サーバー（`api.authlete.com`）の Authlete のバージョンを 1.1 から 2.1 に更新しました**（[アナウンス](https://www.authlete.com/ja/news/20200203_major_update_complete/ "サービス更新作業完了のお知らせ")）。これにより、新しい OAuth / OIDC の仕様を試していただけるようになりました。特に、**FAPI、MTLS、CIBA は注目**です。なお、PAR、RAR、IDA は Authlete 2.2 以降でのサポートとなるので、共用サーバーでは利用できません。Authlete のバージョンごとの仕様サポート状況については、[スペックシート](https://www.authlete.com/ja/legal/spec_sheet/)をご確認ください。

Authlete 社は、FAPI、MTLS、CIBA、PAR、RAR、IDA などの最新仕様の策定作業に深く関わった上で実装をおこなっています。そのため、これらの最新仕様について多くの知見を持っています。これらの最新仕様を利活用されたい場合は、是非 Authlete の採用をご検討ください。お問い合わせは[コンタクトフォーム](https://www.authlete.com/ja/contact/)またはメール（`sales@authlete.com`）でお願いします。

![Authlete定規.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/106044/e1e379d4-1b4c-7df2-3bb8-599ad933fe9a.jpeg)
<sup>↑ Authlete 社の勉強会に参加するともらえる定規。認可フローのシーケンス図を描くときに便利？！</sup>