5
5

More than 3 years have passed since last update.

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

Last updated at Posted at 2021-08-31

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

▼はじめに

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メソッド)

以下は調整後のもの。

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);
    }

}


以上です。

▼さいごに

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

5
5
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
5