Symfony Advent Calendar 2016の6日目の記事です。
WebTestCaseでログインが必要なページのテストを行う方法(仮)ってネタで書こうと思ったんですが、ググったら@imunew先生のSymfony2 + PHPUnitではじめてのテスト(機能テスト編)の記事が良かったので、KnpUOAuth2ClientBundleでYahooログインを実装するという話をします。
直前の内容変更でごめんなさい・・・。
OAuth2ClientBundleとは?
KnpUOAuth2ClientBundleは、OAuth2ClientをSymfonyで使うためのBundleです。
なぜYahooログイン?
エンジニアな人はソーシャルログインといったらTwitter or Facebookだろうと思っていましたが、国内のソーシャルログイン事情を見てみるとYahooログイン多いようです。 https://www.feedforce.jp/release/9100/
KnpUOAuth2ClientBundleでYahooログインを実現するためにProviderを作った
OAuth2Clientでは、サービスごとProviderを用意する必要があります。 公式でGithub、Facebook、Google、Instagram、LinkedInがサポートはされています。
また、サードパーティとして様々なProviderが用意されています。 Third-Party Providers
ただし、残念な事にYahooID連携はサポートされていません。 自分でProviderの実装を実装する必要があります。
今回Yahooログインを実装するためにtavii/oauth2-yconnectを作りました。 これを利用すればSymfonyからKnpUOAuth2ClientBundleを使って簡単にYahooID連携を行う事が出来ます。
使い方
Symfony3 + KnpUOAuth2ClientBundleでYahooID連携を利用するための方法は以下の通りの手順で行えば出来ます。
- YahooID連携のトークンとかを取得する
- composer requireでOAuth2ClientBundleとoauth2-yconnectを導入する
- app/AppKernel.phpの修正
- config.ymlに設定を記述
- controllerを用意する
- ブラウザからアクセスしてみる。
YahooID連携のトークンとかを取得する
YahooJapan!デベロッパーネットワークのアプリケーションの管理にアクセスして「新しいアプリケーションを開発」より新しいアプリケーションを作成します。
「アプリケーションの種類」をサーバサイド、あとは必要に応じて「アプリケーション名」や「サイトURL」を設定します。 今回はOAuth2によるログインを想定しているので、「利用するスコープ」のチェックは何も入れていません。
アプリケーションの作成が完了したら、アプリケーション一覧の編集よりコールバックURLを指定しましょう。 今回はローカルのビルトインサーバで動かすつもりなのでhttp://localhost:8000/yahoo/callbackを指定します。
composer requireでOAuth2ClientBundleとtavii/oauth2-yconnectを導入する
次にComposerで必要なライブラリを入れていきます。
今回必要なライブラリは2つです。
- OAuth2ClientBundle
- tavii/oauth2-yconnect
|
|
app/AppKernel.phpの修正
お約束ですが、Bundleを入れたら、AppKernelは必須なので、AppKernel.phpを修正します。
|
|
config.ymlに設定を記述
config.ymlに設定を記述します。 「デベロッパーネットワークトップ>アプリケーションの管理>アプリケーションの詳細」よりアプリケーションIDおよび、シークレットを確認してください。 client_idには「アプリケーションID」、client_secretには「シークレット」を入力します。 直接アプリケーションIDやシークレットを記載してもいいですが、parameters.ymlに書いたほうがよいかと思います。
今回はオリジナルのProviderを使っているためprovider_class
でProviderTavii\OAuth2\Client\Provider\YConnect
を指定します。
|
|
controllerを用意する
YahooID連携を使ってログインするために、コントローラを用意します。
|
|
こんな感じに用意します。 今回はホント適当なサンプルなので、とりあえずログイン成功していたら、user_idが表示される感じになります。
ブラウザでアクセスしてみる。
まずはビルトインサーバを起動します。
|
|
その後ブラウザでhttp://localhost:8000/yahooにアクセスしましょう。 Yahooの同意画面が表示されます。
同意してはじめるボタンを押せば、user_idが表示されるかと思います。
スコープについて
YahooID連携では、4つのスコープがあります。
- openid
- profile
- address
tavii/oauth2-yconnectではデフォルトに指定しているスコープがopenid
のみとなります。
このままでは、ユーザーの情報を取得する事はできません。
ユーザーのプロフィール情報を取得してみる。
ユーザーのプロフィール情報を取得するためにはprofile
のスコープを指定する必要があります。
先程作成したControllerでprofileスコープを指定することで、プロフィール情報を取得できます。
|
|
修正後ブラウザでhttp://localhost:8000/yahoo/にアクセスすると若干同意画面が変わります。
状況に応じて必要なスコープを使い分けましょう。
最後に
HWIOAuthBundleでも良いのですが、OAuth2ClientBundleも気軽に実装できるのでおすすめです。
また、Guardコンポーネントを利用することにより、Symfonyの認証としてソーシャルログインを利用する事も可能です。
Guard
Authenticating With Guard
この辺はまた機会があれば、ブログを書きたいと思います。
また今回のソースコードをgithubに用意しました。
polidog/symfony-oauth2-sample
よかったら試してみてください。