HWIOAuthBundleでYahoo ID連携をする

HWIOAuthBundleでYahoo ID連携をする

June 14, 2016,
tags: symfony php yahoo


このエントリーをはてなブックマークに追加

Symfony2でOAuthのログイン系の処理を実装する場合に非常に便利なHWIOAuthBundle

世界的に有名なサービスは対応していますが、「Yahoo ID連携」は対応していないんですよね。ちなみにYahoo.comのほうは有るみたいです。

今回はそんなHWIOAuthBundleでYahoo ID連携をする実装をしてみました。

目次

  • そもそも対応してないサービスの場合どうするのか?
  • config.ymlに設定を記述する
  • 認証が通らない問題
  • 自分でResourceOwnerを作る
  • 自分で作ったResourceOwnerを使うには
  • PR送ります
  • 最後に

そもそも対応してないサービスの場合どうするのか?

最初はサポートしているサービスしかだめなのかなと思っていましたが、流石にそんなことはありませんでした。
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)」の仕様を元に設定していきます。 今回はこんな感じで設定しました。

  paths:
      identifier: user_id
      nickname: name
      realname: name
      firstname: given_name
      lastname: family_name

認証が通らない問題

実際に設定が完了したところで、実行してみました。
しかしログイン出来ていませんでした。

エラーログを確認したところ以下のエラーが出ていました。

security.INFO: Authentication request failed. {"exception":"[object] (Symfony\\Component\\Security\\Core\\Exception\\AuthenticationException(code: 0): OAuth error: \"required client basic authenticate\"...."} []

調べていくとどうやらアクセストークンを取得する処理に問題があったようです。 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を利用してください。

comments powered by Disqus