自分用のメモとして残します。
▼はじめに
Laravel Socialiteを用いてYahooJapanとのID連携を行おうと思ったら、Laravel Socialiteはデフォルトでは連携できないようだ。
本家Yahooとの連携は専用のライブラリをcomposerで入れればLaravel Socialiteが拡張される。
問題はYahooJapan用のLaravel Socialiteの拡張ライブラリは無いようで、自分で実装しないといけない模様。
んー面倒だなと思ったら、@zaburo様が投稿された「Laravel Socialite用のYahoo JAPAN ID(YConnect)ドライバ実装」という記事を見つけ参考にさせていただきました。。
こちらではv1用ではありますが、ほんの少し変更するだけでv2用の連携ができた。
やり方
注意)自分用のメモ程度に記述であり、動作保証をするものではないのであしからず。
0.前提
・Laravel Socialite導入済
・@zaburo様が投稿された「Laravel Socialite用のYahoo JAPAN ID(YConnect)ドライバ実装」を参考に必要ファイルを用意する。
1.YahooJpProvider.phpを調整
YahooJpProvider.phpを調整(エラーが出た箇所を調整)
・URLをv2に変更。
・トークンによるユーザ情報取得の処理を調整(getUserByTokenメソッド)
・連携したYahooのユーザ情報を調整(mapUserToObjectメソッド)
以下は調整後のもの。
<?php
namespace App\Socialite; //TODO:プロジェクトによって名前空間の変更する
use Laravel\Socialite\Two\AbstractProvider;
use Laravel\Socialite\Two\ProviderInterface;
use Laravel\Socialite\Two\User;
class YahooJpProvider extends AbstractProvider implements ProviderInterface
{
//scopeの区切り文字設定
protected $scopeSeparator = ' ';
//スコープ設定
protected $scopes = [
'openid',
'profile',
'email',
];
//認証用URL($stateはオプション)
protected function getAuthUrl($state)
{
return $this->buildAuthUrlFromBase('https://auth.login.yahoo.co.jp/yconnect/v2/authorization', $state);
}
//token取得用URL
protected function getTokenUrl()
{
return 'https://auth.login.yahoo.co.jp/yconnect/v2/token';
}
//Token取得の際のオプション
//Basic認証と必要なPOSTパラメータを送付
public function getAccessToken($code)
{
$basic_auth_key = base64_encode($this->clientId.":".$this->clientSecret);
$response = $this->getHttpClient()->post($this->getTokenUrl(), [
//認証
'headers' => [
'Authorization' => 'Basic '.$basic_auth_key,
],
// 'form_params' => $this->getTokenFields($code),
// 直接記述
'form_params' => [
'grant_type' => 'authorization_code',
'code' => $code,
'redirect_uri' => $this->redirectUrl
],
]);
return $this->parseAccessToken($response->getBody());
}
//ユーザー情報取得
protected function getUserByToken($token)
{
//url + schema=openidが必要だった
$response = $this->getHttpClient()->get('https://userinfo.yahooapis.jp/yconnect/v2/attribute?schema=openid', [
'headers' => [
// 'Authorization' => 'Bearer '.$token['access_token'],
'Authorization' => 'Bearer '.$token,
],
]);
return json_decode($response->getBody(), true);
}
//Userにパラメーターをマップ(必要に応じてその他のパラメータ追加)
protected function mapUserToObject(array $user)
{
return (new User())->setRaw($user)->map(
'id' => $user['sub'],
'name' => $user['name'],
'email' => $user['email'],
]);
}
//token parse用の関数
protected function parseAccessToken($body)
{
return json_decode($body, true);
}
}
以上です。
▼さいごに
冒頭でも述べたように動作保証をするものではないので、あくまで参考程度にお願いいたします。