ちょっと話題の記事

【書評】雰囲気でOAuth2.0を使っているエンジニアがOAuth2.0を整理して、手を動かしながら学べる本 #技術書典7

2019.09.27

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

技術書典7で頒布された「雰囲気でOAuth2.0を使っているエンジニアがOAuth2.0を整理して、手を動かしながら学べる本」を読んでみたのですが、良かったので紹介します。 以下で購入可能です。

雰囲気でOAuth2.0を使っているエンジニアがOAuth2.0を整理して、手を動かしながら学べる本

雰囲気でOAuth2.0を使っているエンジニアがOAuth2.0を整理して、手を動かしながら学べる本

すごくざっくり言えば、OAuth 2.0 ってなんなの?と、実際にサービスのエンドポイントを叩いて各フローを実際に体験するチュートリアルから構成されています。

私が特に良いなと思ったのは、

  • 実際に存在するサービスを使った例に合わせて説明が進むので、それぞれのロールが「そもそもなんなのか」がわかりやすい
    • 具体的なサービスが記載された各フローのシーケンスが載っている
  • 解説が重要なポイントに絞られているため、サクサク読める
  • OAuth 2.0 で未定義な仕様について、実際に実装する場合はだいたいこうなる、といった話にが書いてあるので、フローのイメージがわきやすい

といったところです。

私が以前 OAuth 2.0 について学ぶ必要があった時はまず OAuth 2.0 の仕様を読んだのですが、そもそもなんのための仕様なのか?を理解するまでに結構時間がかかった記憶があります。 また、あくまで定義されている仕様なので、「実際にどうなるのか?」のイメージがわきづらいことがありました。

例えば、The OAuth 2.0 Authorization Framework 4.1 Authorization Code Grant には

(B) The authorization server authenticates the resource owner (via the user-agent) and establishes whether the resource owner grants or denies the client's access request.

という記載がありますが、なぜか当時これを初めて読んだ時には、

authorization server authenticates the resource owner (via the user-agent)

が何を指すのか理解できませんでした。

本書籍では、OAuth 2.0 が特定の認証方法を定めているわけではない話をした上でシーケンスに沿って

認可サーバーはリソースオーナーにログイン画面を表示して、ユーザー名、パスワードの入力を求めます。5番でリソースオーナーがユーザー名、パスワードを入力し、認証が完了します。

まで言い切っており、具体的に何が起こるのか、のイメージがわきやすいのではないかと思います。

また、特に書籍で語られている話ではないのですが、個人的にこの本は認可サーバーの開発者よりもクライアント実装をする方に向けて書かれているように感じます。 OAuth 2.0 の仕様はあくまで OAuth 2.0 の仕様なので、クライアントがすべきことだけではなく、当然認可サーバーやリソースオーナーの開発者が何をしなくてはならないか、まで書かれているので、クライアントだけ実装したい人がサクッと理解しようとするにはなかなか辛いこともあるのではないでしょうか。

その点、本書籍はクライアントが何をしなければならないか?にフォーカスしているように思えるので、非常に読みやすくおすすめです。

どのような人に勧めたいか

上記を踏まえて個人的には、以下のような方が読むと非常に有用な本なのではないかと感じました。

  • OAuth 2.0 を学びたいが、仕様を読むのがしんどい方
    • 特に、クライアントの実装をしたい方
  • OAuth 2.0 の仕様を読んだが、イメージがわかない方

各章の何が学べるのか? & 個人的に感じたこと

以下に書籍の各章を読むことで、何が学べるのか?と私が書籍を読みながら個人的に感じたことを記載します。

第1章 はじめに

この章では、そもそも OAuth 2.0 とはなんなのか?なぜ OAuth 2.0 である必要があるのか?について学ぶことができます。 また、OAuth 2.0 ではない他に考えられる手段で実装した場合に、どのような問題があるのか?OAuth 2.0 ではどのようにそれらの問題が解決できるのか?について説明されています。

第2章 OAuth のロール

The OAuth 2.0 Authorization Framework 1.1 Roles に記載されている OAuth 2.0 の各ロール(リソースオーナー、クライアント、リソースサーバー、認可サーバー)について、それぞれどういった役割があるのか?を学ぶことができます。 また、各ロールの関係性が図によって説明されています。

最初にこれをしっかりと理解することで、この後のフローについての説明や、もしくはOAuth 2.0 の仕様を読む時の理解が進むと思います。

第3章 OAuth のトークン

アクセストークンリフレッシュトークン認可コードが何に使われるのか?どのような構造なのか?ついて学ぶことができます。

第4章 OAuth のエンドポイント

OAuth 2.0 に登場する各エンドポイント(認可エンドポイントトークンエンドポイントリダイレクトエンドポイント/リダイレクトURI)について、

  • 誰が提供するのか?
  • どのような役割があるのか?

について学ぶことができます。

第5章 OAuth のグラントタイプ

について、

  • どのような流れで実際にアクセストークンを取得するのか
  • 各グラントタイプの特徴
  • どのようにグラントタイプを選択すれば良いのか?
  • 各エンドポイントに、どのようなパラメータを送れば良いのか?
  • インプリシットグラントはなぜ非推奨になったのか?
  • PKCE のフローと、PKCE によって何が防ぐことができるのか?

を学ぶことができます。 また、検索すればいくらでも出てくるものではありますが、各グラントタイプのシーケンスが1冊の本にまとまっているのは非常にありがたいです。

個人的には state と PKCE の説明がわかりやすくて良いなと思いました。

第6章 チュートリアル

実際のサービスを利用して、

  • 認可コードグラント
  • 認可コードグラント & PKCE
  • インプリシットグラント

でアクセストークンを取得するチュートリアルを行うことができます。

OAuth 2.0 の世界の解説だけではなく、各サービスの設定方法もスクリーンショット付きで解説されています。

付録 A OAuth 認証について

OAuth 2.0は認可のためのプロトコルですが、認証のために利用されているケースが数多くあります。 この章ではどのような仕組みで認証を実現するのか、について学ぶことができます。 また、インプリシットグラントで OAuth 2.0 による認証を実装した場合の脆弱性の存在にも軽く触れられていますが、こちらは OAuth、OAuth認証、OpenID Connectの違いを整理して理解できる本で詳細に説明されています。 OAuth2.0 で認証を実現したい方は、こちらの本も合わせて読むのが良いかと思います。

付録 B S256 での code_challenge の算出

PKCEで登場する code_verifier、code_challenge について、ターミナルで code_verifier からcode_challenge を算出するコマンドが紹介されています。

付録 C OAuth 用語の英語と日本語の対応

各用語の対応です。 読みながら何かのアプリで Implicit grant が「暗黙」と訳されていたのを思い出しました。(書籍では「インプリシット グラント」とされています。)

まとめ

雰囲気でOAuth2.0を使っているエンジニアが OAuth2.0 を整理して、手を動かしながら学べる本を紹介させていただきました。

  • OAuth 2.0 を学びたいが、仕様を読むのがしんどい方
    • 特に、クライアントの実装をする予定だが、認可サーバーなどを作る予定がない方
  • OAuth 2.0 の仕様を読んだが、イメージがわかない方

には是非おすすめしたいです。私は RFC 6749 を一通り読んで、ある程度理解しているつもりだったのですが、それはそれで仕様とにらめっこしながら書籍を読むのもなかなか面白かったので、ある程度わかっている方が復習感覚で読むのも面白いと思います。

OAuth、OAuth認証、OpenID Connectの違いを整理して理解できる本については、後ほど別の記事でご紹介させていただく予定です。

クラスメソッド の事業開発部ではソフトウェアエンジニアを募集しています

現在私は事業開発部で prismatix というサービスの開発に携わっています。 具体的には認証認可のためのマイクロサービスの開発を行なっています。 OAuth 2.0 および OIDC の仕様を読みながらコードを書く仕事です。

そして、事業開発部ではソフトウェアエンジニアを募集しています。

もし興味のある方がいましたら、こちらのページを見ていただけますと幸いです。

私からは以上です。