【Laravel】Laravel Socialiteを用いてYahoo JAPANのYahooID連携v2のOAuth2.0を用いた連携を行う。

自分用のメモとして残します。

#▼はじめに
Laravel Socialiteを用いてYahooJapanとのID連携を行おうと思ったら、Laravel Socialiteはデフォルトでは連携できないようだ。
本家Yahooとの連携は専用のライブラリをcomposerで入れればLaravel Socialiteが拡張される。
問題はYahooJapan用のLaravel Socialiteの拡張ライブラリは無いようで、自分で実装しないといけない模様。
んー面倒だなと思ったら、@zaburo様が投稿された[「Laravel Socialite用のYahoo JAPAN ID(YConnect)ドライバ実装」](https://qiita.com/zaburo/items/25ebbb3d1b580a0df9f3)という記事を見つけ参考にさせていただきました。。
こちらではv1用ではありますが、ほんの少し変更するだけでv2用の連携ができた。


#やり方
**注意）自分用のメモ程度に記述であり、動作保証をするものではないのであしからず。**
###0.前提
・Laravel Socialite導入済
・@zaburo様が投稿された[「Laravel Socialite用のYahoo JAPAN ID(YConnect)ドライバ実装」](https://qiita.com/zaburo/items/25ebbb3d1b580a0df9f3)を参考に必要ファイルを用意する。

###1.YahooJpProvider.phpを調整

YahooJpProvider.phpを調整（エラーが出た箇所を調整）
・URLをv2に変更。
・トークンによるユーザ情報取得の処理を調整（getUserByTokenメソッド）
・連携したYahooのユーザ情報を調整（mapUserToObjectメソッド）


以下は調整後のもの。

```YahooJpProvider.php
<?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);
    }

}


```
以上です。

#▼さいごに
冒頭でも述べたように動作保証をするものではないので、あくまで参考程度にお願いいたします。