マイクロサービスで必要になるかなぁって思って僕がOAuth2とOpenID Connectをなんとなく分かるようになるまでの物語

プライベートの勉強は気が向くままにふらふらと。梅田の地下街を歩いてる感じで!(←つまり迷ってる)

元々は、Pivotal Japanさんの、この「今日から君もヒーローだ!」的なタイトルに惹かれてJava(Spring Cloud)でマイクロサービス作るぞーって進めてみたのであった。が、早速その2の「認可サーバーを立ち上げよう!」で「あー、これ知らない。分かんない。もう寝たい。」となってしまったのだった。

そんな僕が「なんとなく分かった!」になるまでの物語。・・・になるはず(ここを書いてる今はまだ分かってない)。

たぶん1ヶ月したら何を読んだか忘れてると思うので記録しとくことにした。

github.com

ゴール

OAuth 2.0って聞いたことあるけど、よく知らない。この辺、マイクロサービスの認証・認可部分で必要そうだなーって思うので、OpenID 2.0とOpenID Connectも含めて勉強してみることにした。

  • OpenIDとかOAuthとかを提供する側じゃなくて、使う側の知識を勉強する。
  • シングルページのアプリとかネイティブアプリとかじゃなくて、普通のWebアプリ限定でいいかな。

まずはじめに

これ↓を見つけて見てみて、・・・うむ、わからん!

www.slideshare.net

一気に進みすぎた!一歩ずついこう!

認証と認可とID連携って何?

そもそもID連携って何なんだっけってのはこちら↓が分かりやすかった。

www.slideshare.net

OpenIDとOAuthとOpenID Connectってどういう関係?

んで、どういう経緯があるんだろう?ってのはこちら↓が分かりやすかった。めっちゃ長いけど、今の僕に必要なのは「ここまでは前置きです」の部分までかな。

qiita.com

もうちょっと噛み砕いて理解したいなと思ってたところで、こちら↓を読んだ。ふむふむ。うーむ、なんとなく分かってきた気がするー。でも、最後のOpenID Connectのところはまだ全くピンときてないなー。ちょこちょこ見かけてたJWT(ジョットって読むらしい)も最後に少しだけ登場。

www.sakimura.org

まずはOAuth 2.0からいってみよう!

これ↓が分かりやすかった。僕が知りたいのはAuthorization Code Grantってのみたいね。

www.slideshare.net

それから、これ↓も分かりやすかったな。

www.atmarkit.co.jp

www.atmarkit.co.jp

OAuth認証

ここまで勉強してたら、OAuthは認可だよってのをよく見るんだけど、OAuth認証とかも聞くよなぁって思ったところでこちら↓を読んでふむふむ。

oauth.jp

OAuthを認証に使うと?

でもこれ↓を見ると Implicit grant flow 使った場合には気をつけなきゃってことかな。ふむふむ。

www.sakimura.org

OAuth 1.0 と OAuth 2.0 の違い

そういえば、1と2でどう違うんだろう?ってのが気になって調べてみた。ふむふむ。OAuth 2.0だけ勉強すれば良さそう。

OAuth 2.0でWebサービスの利用方法はどう変わるか(1/3)- @IT

次はOpenID

おぉ。こちら↓は、これまで見てきたもののまとめになってて、分かりやすい。

www.atmarkit.co.jp

からの OpenID Connect!

やっとここまできたか。これまで「OpenID ConnectはOAuth 2.0の拡張だよ!」というような記述を見て「?」ってなってたけど、なんか分かってきた。

www.atmarkit.co.jp

OAuth 2.0の仕組みに、IDトークンと、UserInfoエンドポイントが加わったってことなのかな。で、IDトークンには発行元とか発行先とか署名とかがある。と。クレームの部分はよく分かんないけど、まいっか。

ID Tokenって?

JWT形式なんだっけ?と思ってこちら↓を見てみた。なるほど。

www.ogis-ri.co.jp

JWTについて

JWTとかJWEとかJWSとか出てきたので頭の整理。

oauth.jp

openid-foundation-japan.github.io

からの、もう一度トライ!

www.slideshare.net

うぉー。だいぶ分かるようになってたよー!

結局、僕が分かりたかったものは分かりそうなのか!?

と思っておそるおそる見てみた。

github.com

security.oauth2.client.client-id=demo
security.oauth2.client.client-secret=demo
security.oauth2.client.scope=openid
security.oauth2.client.authorized-grant-types=password,authorization_code
@RequestMapping(path = "/userinfo", method = RequestMethod.GET)
Object userinfo(Authentication authentication) {
  return authentication;
}

あぁ、なんとなく分かるぞー!!(∩´∀`)∩ワーイ

おわりに

まだ正直、頭の中に「?」はいっぱいあるのだけど。例えば、どうしてOpenID Connectだとバスが通れないのか、とかがちゃんと自分の中で考えられてない。なので、これからもOpenID Connect周りは勉強していこう。でも一旦、Spring CloudのAuth周りは読み進められそうなので、良かった。