Spring SecurityのOAuth2.0関連の歴史を調査し実装してみた
   4 min read

Qiita に昔(2019年中頃)書いていた資料を転記し忘れていたので構成を見直してアップロードし直します。

2020年現在の状況はまた更新されています。次のURLを参照してください。

背景と概要

Spring Boot最新版(2.1.6.RELEASE)でOAuth 2.0 対応のリソースサーバ兼認可サーバを実装する必要に迫られましたが、Spring的にOAuth 2.0 対応が過渡期なようでドキュメントを探したりするのに手間取りました。

本エントリは、ドキュメントの所在のメモと、自分の理解度の確認として冒頭に紹介した @kazuki43zoo さんのコードを Spring Boot 2.1.6.RELEASE へマイグレーションしてみたのでそれについてもメモするためのものです。

Spring Boot2.1.6における OAuth 2.0 対応

リファレンス 30.3.3 Authorization Server では

Currently, Spring Security does not provide support for implementing an OAuth 2.0 Authorization Server. However, this functionality is available from the Spring Security OAuth project, which will eventually be superseded by Spring Security completely.

— Spring Boot 2.1.6.RELEASE リファレンス 30.3.3 Authorization Server

と若干引っかかる説明になっています。 これはどういうことかというと、この節のリンクの何クリックか先にあるドキュメント

を見ることで事情が理解できます。 (注: 現在は当時から改訂が入っています)

  • OAuth 2.0 は "Spring Security" で実現する方針で、Spring Boot 1.x の頃に利用していた "Spring Security OAuth"(spring-security-oauth*)はもはやメンテナンスモードである

  • とはいえ、Spring Securityにはまだ認可サーバサポートがない

    • (予定では "the end of 2018 or early 2019" に対応、だったようだが)

というわけで、現時点で認可サーバ実装を行おうとした場合には spring-security-oauth2 を利用することになります。

リソースサーバやクライアントはSpring Securityのものが利用できるのかというと、不可能ではないが 何やら面倒そうな気配 がします。 何か問題が起きたときに解決できる気がしなかったので私は今回Spring Security版を採用するのはやめました。

まとめると、Spring Bootでリソースサーバ兼認可サーバを作る場合、現時点ではSpring Boot 1.x の頃と同じ仕組みを利用するのが無難そう、という結論に至りました。

リファレンス

spring-security-oauth2-boot の 2.1.6版だけでなくcurrent-SNAPSHOT版も見ないと情報が出揃わない、というのが罠でした。

今回作成したコードについて

冒頭で紹介した @kazuki43zoo さんのソースのforkです。 非互換性といくつか本質的でない変更を行っているのでそれについて記載しておきます。

  • クライアントにブラウザでアクセスした際の認証は OAuth 2.0 とは無関係かと考えたのでスキップするようにしています。 98db0dd

    • (追記)ワンショットのリクエストならそれで問題ないのですが、 refresh_token のフローを見てみたい場合などはクライアントがセッションを持っている必要がありました(ので後にもとに戻しています)。

  • grant_type: passwordが通りませんので「アクセストークンの取得」の動作確認ができません。

    • このへん やってないからかな、と思うのですがあまり興味がなかったのでちゃんとは見ていません。

  • 元々 application.properties で設定されていたものがJava Configに移っています。リファレンスを真似たためです。 87ab08

  • Spring Data JDBCで実行時エラーになるのですが直し方がわからなかったので Spring Data JPA に移し替えました。 3faf6e

  • Javaバージョンを11に上げています。 c70a534