It Made My Day

Acutally, my whole life is just one big yak shaving exercise.

「OAuth徹底入門」のサンプルコードをGoで書いてみた

認可 is 何みたいな話はこちら

OAuth2.0 に則った認可コードフローのMVP実装をGoで書いた

業務で認可サーバーを開発している関係で、最近OAuth徹底入門 セキュアな認可システムを適用するための原則と実践を読んだ。 歴史ある分野だけにフローや仕様など理解しようとすると複雑だが、基礎となる概念から技術的な話までいろんなレイヤの思考を行ったり来たりしながらも順を追って理解できる良書だったため、OAuth2.0を学びたい方には圧倒的におすすめ。

サンプルコードはJavaScript & Expressで書かれているのだが、Goだとライブラリの使い勝手などで多少異なる部分もあるため、自力で書き直してみた。

github.com

なお、「サンプルコードをGoで書いてみた」というのは実質嘘で、現状進捗はWebアプリを想定したBearerトークンを使う認可コードフローの部分のみ。つまり、3章まで。 だが、基本的に認可コードフロー以外のパターンを使用することは推奨されていないため、一旦ここで区切りとすることにした。 今後もちょこちょこ書きたいと思っていて、個人的に特に実装したいところは下記(優先度順)。

  • JWTトークンを用いる場合の実装
    • トークン取り消し (Token Revocation)
  • 動的クライアント登録
  • OAuthを用いた認証
  • PoPトークンを用いる場合の実装

OAuth2.0完全理解への道

結論、ググってシュッと概要を理解しようとしても秒で心が折れる類の話だったので、いきなりこの本を読むのがむしろ近道だと感じた。 「きちんと理解したい場合は結局のところ手を動かすことが一番早い」というのはOAuthに限った話ではないが、特にOAuthを勉強する上では、「あれ、これってどこからとってくるデータだっけ?」とか、「なんでこの仕組みで脆弱性防げるんだっけ?」とか、本の説明を読んでるだけだと空中戦感が出てきやすい。本書のコードを追うだけでもかなり勉強にはなるが、実装しながら地道に頭に叩き込むことで知識が定着する類だと思う。

名著の宿命とも言えるのかもしれないが、それでもやはりこの本は分厚い。サラッと読むだけでも大変なので、必然的にたまに全体像と自分の現在地を把握したくなる時はあるだろう。 いずれにせよざっくり理解したいという場面で個人的に最も勉強になったのは、こちら↓の動画。

www.youtube.com

AuthleteさんはSaaSサービスとして認可機能を提供している会社で、Qiitaなどでも記事を書いていらっしゃるので、気になる方は見てみてほしい。

余談

OAuth 2.0を勉強するニーズがなくても、HTTPサーバーの実装に慣れてない人がWebに関する知識を深めることもできそうなテーマだと感じた。サラッとフローを追うためだけに実装することももちろんできるが、細かいケースに対応しようと思うとHTTP周りの仕様を細かく調べることになるだろう。実際、ここまでhandlerがモリッとするコードはサーバーサイドをやってるとあまりお目にかからない気がする。

まずhandlerとかがよくわからん、という方はこちら↓の本がとてもおすすめ。

また、GithubのREADMEに使用したライブラリについても書いたが、Goを用いた開発についても学べるサンプルになると良いなとも思っている。