Azure AD B2CをPHPと使う (3) フレームワークの活用について考える
Azure AD B2CのサンプルでLaravel版があったことは以前に書きましたが、それ以外の選択肢について調べました。
いわゆる、プラグインやバンドルでOAuth、SSOを目的としたものであれば対応できるのではないかと考えられます。
Symfony バンドル
PHPでフルスタックなフレームワークとしてまずはSymfonyについて
ざっと検索した感じでは、2種類のOAuth向けバンドルが有名なんでしょうか。(ご存じの方がいたら教えてください)
いずれもOAuth2対応で、その認証にAzureを含んでいることから、Azure AD対応がされていることが推測され、また、その結果としてAzure AD B2Cに対しても多少カスタマイズすれば対応可能なのではないかと思います。
Drupal
CMSとフレームワークの中間的Drupalでは、Azure AD B2C対応がされています。
Guide to Configure Azure AD B2C as an OAuth Server for Drupal
フレームワークと比べ、必要とあらば作り込みまでできてしまうところがDrupalのようなサイズのCMSの特徴といえるかもしれません。
Laravel プラグイン
Laravelには、Laravel Socialiteという有名なプラグインがあるそうで、いわゆるSSO関係を幅広くサポートするプラグインのようです。
そして、これを使った例。
Laravel Socialite でMicrosoft Graph (Office 365アカウント)認証する – hrendoh's tech memo
このブログ記事では、Laravel Socialiteを用いてMS Graph を使用しています。実際これができるのであれば、Azure AD B2Cにも対応できるのではないかと想像します。
ありますね。
ほとんど、これでいけるんじゃないか?という気がしますがどうでしょうか。
Zend Framework
Zend Framework3では、zend-authenticationの中のアダプターに、LDAPアダプターがあります。Active DirectoryはLDAPプロトコルもサポートしているので、認証関係はLDAPアダプターで実現できます。
LDAP - zend-authentication - Zend Framework Docs
また、このLDAPアダプターはMicrosoft Active Directoryについてテストもされているので、Windows 環境でシームレスにWebを扱いたい場合には有力な候補となると思います。
おそらく、Azure AD B2Cにも活用できると思うのですが、Azureの場合、LDAPサーバーはどこを指定すればいいんですかね?
OAuthプラグインは必要なのか?
いろいろとみてきましたが、全体設計をシンプルにするならPHPでOAuthを全部受け持つのがよいとは思えないのです。
認証周りはエンドポイントとの通信が多く発生します。そのたびに自前のサーバーを通すのはエコじゃないですよね。ブラウザーとエンドポイント間で認証してもらい、アプリケーションサーバーは検証するだけでほとんどのシナリオは解決可能なはずです。
そうすると、他の機能のために保守が必要であったり、場合によってはセキュリティホールにもなりうるものを使うよりも、シンプルにトークンの検証に特化した方が幸せなような気がします。
そういうわけでSymfonyで、トークンの検証をサポートすればいいのでは?というのが今の雑感です。
実際には、APIにおいてはAuthorizationヘッダーを読んで検証するだけであれば、Authentication Providerではなく別のフックを利用するべきなのかもしれませんが、詳しい方、教えていただけると幸いです。