OpenID Connect Certification を取得するまでの流れ

# 概要
OpenID Connect Cerification を取得するために必要なことと、流れを整理しました。
[公式サイト](https://openid.net/certification/instructions/)に詳しく書いてあることですが、実際に取得していく中でわかりにくい点があったので、これから取得しようとしている方の参考になれば幸いです。
本記事は Basic OP という、 Authorization Code Flow で実装した Provider のみを対象としています。

# OpenID Connect Certification とは？
OpenID Foundation が提供しているプログラムで、このプログラムを通過することにより、対象の実装が OpenID Connect の標準仕様を満たしていることを宣言し、`OpenID Certified Mark` を使えるようになります。

## 参考
- OpenID Certified Mark
    - ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/65416/3c0e9783-1822-fd9b-4896-06ac112dfbc6.png)
- [OpenID Certification](https://openid.net/certification/)
- [Yahoo! JAPANのOpenID Certified Markの取得について](https://techblog.yahoo.co.jp/advent-calendar-2016/openid_certified/)

# 大まかな流れ
1. OpenID Connect Provider を実装してインターネットに公開する
2. Conformance Test を実施して Failed がないようにする
3. 結果をダウンロードして、いくつか必要なファイルを追加した上で、zip ファイルにまとめて certification@oidf.org 宛にメールで送る
4. 内容が足りなかったりしたら指摘されるので、修正して再送する
5. ほぼOKとなったら、支払いしてくれといわれるので、[ここ](https://openid.net/foundation/members/certifications/new) から Paypal で支払いする
6. 認証済プロバイダーとして[一覧](https://openid.net/certification/) に表示される

## 1. OpenID Connect Provider を実装してインターネットに公開する
[仕様書](http://openid-foundation-japan.github.io/openid-connect-core-1_0.ja.html) に従って実装します。
各種言語のライブラリがそろっている (https://openid.net/developers/certified/#OPLibs) のでそれらを使っても良いと思います。

## 2. Conformance Test を実施して failed がないようにする
このテストを実行することで、OpenID Connect の標準仕様にそった実装ができているかどうかを確認することができます。

1. https://op.certification.openid.net:60000/new でテストを作成
    - Issuer
        - ID Token に含まれる iss と同じものです
        - .well-known を提供している場合は、 .well-known をホストしている URL を指定します
    - Tag
        - 同じ issuer で複数のテストを作成する場合（Basic OP  と Implicit OP など複数の Profile をテストしたい場合など） はわかるようにタグをつけておいたほうが良いかもしれません
        - なんでもよいです
    - Features
        - .well-known を提供している場合は `Dynamic Provider Information Discovery` にチェックをつけます
            - endpoint の情報などを .well-known から取得してくれるため、この後の設定で指定する必要がなくなります
    - Response Type
        - Basic OP の場合は `code` を指定します
2. テストの設定
    - テスト作成後、設定画面に遷移します
    - このテストは、要は対象の OP に対して、 テスト用の RP (Relying Party) を立ち上げて、 OpenID Connect のプロトコルに沿った認証・認可までできるかどうかをチェックするものです
    - この設定画面は、 RP に必要な情報（client_id とか client_secret とか）を入力するものです
    - redirect_uris が発行されているので、クライアント情報を OP に登録した上で、 client_id, client_secret を発行してください
3. テストを実施
    - すべてが Succeeded になる必要はなく、 Warning が含まれていても大丈夫です
    - Failed が一つでも含まれているとダメです 
    - いくつかテスト実施中にブラウザのスクリーンショットを取る必要があります
      - 以下4つのテストのスクリーンショットを送るよう指示されました
          - OP-propmpt-login
          - OP-redirect_uri-NotReg
          - OP-Response-Missing
          - OP-Req-max_age=1

## 3. 結果をダウンロードして、いくつか必要なファイルを追加した上で、zip ファイルにまとめて certification@oidf.org 宛にメールで送る
1. テスト結果をダウンロードする
    - テスト作成時に発行された URL (https://op.certification.openid.net:61234 のポートが異なるもの) の `/log` にテスト結果をテキストで取得できるのリンクが表示されています。
    - リンク先ページの末尾に、`Download tar file` というリンクがあるので、ここでまとめてテスト結果をダウンロードしてくだｄさい
2. [指示](https://openid.net/certification/submission/) に従って zip にまとめる
    - zip ファイルに含めるのは以下のファイル
        - OpenID-Certification-of-Conformance.pdf
            - 以下に必要事項（代表者のサインなど）を記入して、`OpenID-Certification-of-Conformance.pdf` というファイル名にする
            - https://openid.net/wordpress-content/uploads/2019/03/OpenID-Certification-of-Conformance.pdf
        - OpenID-Certification-Terms-and-Conditions.pdf
            - 以下ファイルをそのまま
            - https://openid.net/wordpress-content/uploads/2019/03/OpenID-Certification-Terms-and-Conditions.pdf
        - テスト結果
            - 「1」 で取得したファイルをそのまま
        - スクリーンショット（テストと同じ名前をつける）
            - OP-propmpt-login.png
            - OP-redirect_uri-NotReg.png
            - OP-Response-Missing.png
            - OP-Req-max_age=1.png
    - zip のファイル名
        - `\${組織名}-\${サービス名}-\${Profile}-\${提出日}.zip`
        - 例えば、Hoge 株式会社が提供する Fuga というサービスが実装した Basic OP をテストし、2020-01-23 に提出した場合
            - `Hoge-Fuga-OP-Basic-23-Jan-2020.zip` というファイル名になる
    - メールの件名
        - `Certification request by \${組織名} of \${サービス名} for the \${Profile} profile`
        - 例えば、Hoge 株式会社が提供する Fuga というサービスが実装した Basic OP をテストし、2020-01-23 に提出した場合
            - `Certification request by Hoge of Fuga for the Basic OP profile`

## 4. 内容が足りなかったりしたら指摘されるので、修正して再送する
対応は丁寧ですが、レスポンスはあまり良くないです。
担当してくれた方が holiday で offline になったとかで10日以上返事がなかったこともありました。
早くても3日くらい間があくので、スケジュールには余裕を持ったほうがよいです。
今回は、年末年始を挟んだというのもあって、初回の提出から承認まで約1ヶ月かかりました。

## 5. ほぼOKとなったら、支払いしてくれといわれるので、[ここ](https://openid.net/foundation/members/certifications/new) から Paypal で支払いする
OpenID Foundation メンバーの場合は \$500、そうでない場合は \$2500 です。
また、支払いを行った年であれば、追加費用なしで別の Profile の Certification を取得できます。
例えば、2020年1月に Basic OP で取得したサービスが、6月に Hybrit OP を実装した場合、追加コストなしで確認してくれるようです。
逆に、翌年になってしまうと同じ金額払わないといけないので、複数 Profile 実装予定で、本プログラムへの参加が年末になりそうであれば、支払いを翌年にしたほうが良いかもしれません。（支払いが済んでいなくても内容の確認はしてくれました）
詳しくは[こちら](https://openid.net/certification/fees/)

## 6. 認証済プロバイダーとして[一覧](https://openid.net/certification/) に表示される
支払いと、内容の確認が完了すると、Google や Auth0 と並んで認証済プロバイダーとしてウェブサイトに表示されて、本プログラムは終了となります。