Symfony2でOAuthのログイン系の処理を実装する場合に非常に便利なHWIOAuthBundle。
世界的に有名なサービスは対応していますが、「Yahoo ID連携」は対応していないんですよね。ちなみにYahoo.comのほうは有るみたいです。
今回はそんなHWIOAuthBundleでYahoo ID連携をする実装をしてみました。
そもそも対応してないサービスの場合どうするのか?
最初はサポートしているサービスしかだめなのかなと思っていましたが、流石にそんなことはありませんでした。
HWIOAuthBundleでは設定ファイルのみで様々なサービスのOAuthログインに対応できます。
HWIOAuthBundleのドキュメントStep2x: Othersを確認すれば理解出来るとかと思います。 OAuth1,OAuth2両方に対応しているので、どちらでもいけます。
「Yahoo ID連携」の場合はOAuth2なのでOAuth2を指定します。
config.ymlに設定を記述する
HWIOAuthBundleでは設定に以下のものが必要になります。
- type
- client_id
- client_secret
- access_token_url
- authorization_url
- infos_url
- scope
- user_response_class
- paths
さてYahooID連携の場合はどのように設定すればいいのか。 一つ一つ説明していきます。
type
typeはHWIOAuthBundleで利用するResourceOwnerを指定します。
通常facebookやtwitterの場合はそのままfacebook,twitterといって指定できます。
今回の場合はoauth2
を指定します。
client_id, client_secret
それぞれ「デベロッパーネットワークトップ>アプリケーションの管理」から確認することができます。
client_id
には「アプリケーションID」を指定してください。
client_secret
には「シークレット」を指定しましょう。
access_token_url
アクセストークンを取得するためのURLです。
Tokenエンドポイントに記載されているURLを記述します。
現在の場合はhttps://auth.login.yahoo.co.jp/yconnect/v1/token
を指定します。
authorization_url
ユーザーの認可を得るためのURLです。
Authorizationエンドポイントに記載されているURLを記述します。
現在の場合はhttps://auth.login.yahoo.co.jp/yconnect/v1/authorization
を指定します。
infos_url
認証成功時にユーザーの情報を取得するエンドポイントを指定します。
属性取得API(UserInfoAPI)のドキュメントを参照すると戻り値などがわかると思います。
とりあえずhttps://userinfo.yahooapis.jp/yconnect/v1/attribute
を記載します。
scope
スコープは用途によって分けてもらえればいいかと思います。
今回はユーザー識別子とユーザーの情報がほしいのでスコープの指定をopenid,profile
と指定しました。
paths
「属性取得API(UserInfoAPI)」の仕様を元に設定していきます。 今回はこんな感じで設定しました。
|
|
認証が通らない問題
実際に設定が完了したところで、実行してみました。
しかしログイン出来ていませんでした。
エラーログを確認したところ以下のエラーが出ていました。
|
|
調べていくとどうやらアクセストークンを取得する処理に問題があったようです。
YahooID連携の場合はアクセストークンを取得する時のリクエストのヘッダに
Authorization: Basic
を指定する必要がありました。
さらにドキュメントを確認すればわかりますが、Content-Type: application/x-www-form-urlencoded
でPOSTでリクエストを送る必要があります。
実際アクセストークンを取得している実装をみてみると、ヘッダーの設定やPOSTでのリクエストではないんですよね。
設定ファイルでどうしようも出来ない・・・
自分でResourceOwnerを作る
設定ファイルでどうにもならないので、自分でResourceOwnerを作りました。
自分で作ったResourceOwnerを使うには
作ったはいいものの、どうやって使えばいいのか・・・
必死にぐぐったらCompilerPass
を使ってクラスを入れ替える方法がありました。
Symfony 2 | HWIOAuthBundle - How to create custom resource owner?
ということでさっそく実装してみました。
これで実行したところ、普通にログイン出来るようになりました。
PR送ります
まあ今回の方法は無理やり感ある実装だと思います。
OAuth2のResourceOwnerを他の認証でも使いたい場合に詰みますよね。
なので、今週あたりにHWIOAuthBundleにYahooID連携用のResourceOwnerのPull Requestを送る予定です。
最後に
Yahooさん、HWIOAuthBundleのドキュメントがしっかりしていたのでYahooID連携出来るようになりまで、それほど辛くはなかったです。
OAuth周りはSDK豊富に出てるのでそちらを使いたくなりますが、Symfonyとの連携を考えたらHWIOAuthBundleで頑張るのもありかと思いまいた。
ぜひぜひ皆さんHWIOAuthBundleを利用してください。