0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

OpauthでYahooJPのOAuth認証を行う

Last updated at Posted at 2020-07-18

Yahoo Japanが提供するWeb APIにはOAuthで認証され、払い出されたトークンを必要とするものがあります。
ここではYahooから提供しているOpauthのライブラリーを使いトークンの取得を行います。

2022年4月27日に「Yahoo! ID連携 v1」はクローズされる予定とのことです。
https://developer.yahoo.co.jp/changelog/2021-08-03-yconnect1.html

Yahooアプリケーション作成

Yahooのアプリケーションにはv1とv2があり「Yahoo ID連携 v1」を選択してください。このライブラリーはv2には対応していません。
また、ここのアプリケーションIDとシークレットをリクエストを送る際の引数にセットします。
image.png

コールバックは以下のような設定です。1行目は必ず書かなければならないURLで、リクエストを送ったパスと同じ階層のoauth2callbackというURLです。理由は後述する処理フローに記述します。2行目は実際にコールバックするURLです。
image.png

必要なもの

  • Git
  • Composer
  • PHP

(面倒ですが手動でダウンロードすれば、GitとComposerは無くてもできます。)

手順

  1. opauthをインストールします。
  2. opauth-yahoojpをインストールします。
  3. opauth.conf.php.defaultをコピーして編集します。
  4. .htaccessを作成します。
  5. Opauthクラスをnewし、認証リクエストを送ります。
  6. 以下のようなYahooのユーザー情報がsessionに設定されます。sessionにはトークンが含まれています。
$_SESSION
array(1) {
  ["opauth"]=>
  array(3) {
    ["auth"]=>
    array(5) {
      ["provider"]=>
      string(7) "Yahoojp"
      ["uid"]=>
      string(26) "SLO5VW7K6I34YQ3CZVF4AIV474"
      ["info"]=>
      array(3) {
        ["name"]=>
        string(0) ""
        ["email"]=>
        string(24) "XXXXXXXXXX@yahoo.co.jp"
        ["email_verified"]=>
        int(1)
      }
      ["credentials"]=>
      array(2) {
        ["token"]=>
        string(2196) "トークン文字列"
        ["expires"]=>
        string(25) "2020-07-12T14:31:39+00:00"
      }
      ...
  }
}

ファイル構成

この構成で話を進めていきます。

ディレクトリ構成
|-composer
|  |-composer.json
|  |-composer.lock
|  |-vendor
|     |-composerでインストールしたファイル群
|
|-src
   |-auth
      |-yahoojp
      |  |-.htaccess
      |  |-opauth.conf.php
      |  |-authentication.php
      |
      |-callback.php

opauthをインストール

composer.jsonを作成します。

composer.json
{
    "require":{
        "opauth/opauth": "*"
    }
}

composer.jsonと同じディレクトリでinstallします。
install後、composer.lockとvenderディレクトリが作成されます。

$ composer install

opauth-yahoojpをインストール

opauthをインストールしたディレクトリに移動し、git cloneします。
e.g. /composer/vendor/opauth/opauth/lib/Opauth/Strategy

$ cd /composer/vendor/opauth/opauth/lib/Opauth/Strategy
$ git clone git://github.com/ritou/opauth-yahoojp.git Yahoojp

opauth.conf.php.defaultを編集

opauthのexampleの中にopauth.conf.php.defaultというファイルがあるので、コピーします。
e.g. /composer/vendor/opauth/opauth/example/opauth.conf.php.default

$ cp /composer/vendor/opauth/opauth/example/opauth.conf.php.default /src/auth/yahoojp/opauth.conf.php

コピーしたファイルを編集します。

  • yhoojpディレクトリまでのパスをセットします。
  • security_saltはデフォルト値のままだと警告が出るのでランダム値にしました。
  • アプリケーションの「アプリケーションID」と「シークレット」を設定します。
opauth.conf.php
$config = array(
-    'path' => '/',
+    'path' => '/auth/',
    'callback_url' => '{path}callback.php',
-    'security_salt' => 'LDFmiilYf8Fyw5W10rx4W1KsVrieQCnpBzzpTBWA5vJidQKDx8pMJbmw28R1C4m',
+    'security_salt' => random_bytes(64),
    'Strategy' => array(
+        'Yahoojp' => array(
+            'client_id' => 'アプリケーションID',
+            'client_secret' => 'シークレット'
+        )
    ),
);

.htaccessを作成

opauthのexampleの中の.htaccessをコピーし、編集します。
e.g. /composer/vendor/opauth/opauth/example/.htaccess
この.htaccessによって、domain/auth/yahoojp以下のリクエストは全てauthentication.phpへ書き換えます。

$ cp /composer/vendor/opauth/opauth/example/.htaccess /src/auth/yahoojp/.htaccess
.htaccess
<IfModule mod_rewrite.c>
    RewriteEngine On
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteCond %{REQUEST_FILENAME} !-f
-   RewriteRule ^(.*)$ index.php [QSA,L]
+   RewriteRule ^(.*)$ authentication.php [QSA,L]
</IfModule>

認証リクエストを送る

Opauthクラスをnewすると、認証処理が開始します。

authentication.php
<?php
$root = dirname(dirname(__DIR__));
require_once $root . '/composer/vendor/autoload.php';
require_once "./opauth.conf.php";

new Opauth($config);

トークンがセッションにセットされる

認証処理が開始すると、YahooJPのログイン画面に遷移します。そこでパスワードなど入力して認証されると、引数のcallback_urlに設定したcallback.phpへコールバックされます。
セッションには、トークン(token)と有効期限(expires)がセットされています。

callback.php
<?php
session_start();

echo('<pre>');
var_dump($_SESSION);
echo('</pre>');

処理のフロー

処理の流れは公式ページにあるように3つの手順があります。
アクセストークンの取得方法(v1)
このライブラリーはnewするとこの手順を全て行ってくれます。

1つ目の「Authorizationエンドポイント」にリクエストする」時に、GETパラメータのredirect_urioauth2callbackをセットします。これがYahooアプリケーションのコールバックURLにこのURLをセットする理由です。

おまけ 動的にコールバックURLを設定する

上記のようにリダイレクトが発生するため、Opauthをnewする時に、引数のcallback_urlに任意の値をセットしても、oauth2callbackにリダイレクトされた時は、セットした任意のcallback_urlは失われデフォルトの{path}callback.phpにコールバックされてしまいます。
そのため、動的にコールバックURLを指定するにはクッキーやセッションにセットしておくのがよいと思います。

authentication.php
<?php
$root = dirname(dirname(__DIR__));
require_once $root . '/composer/vendor/autoload.php';
require_once "./opauth.conf.php";

if($_GET["callback"]) // 例えば、`authentication.php`のGETパラメータにコールバックURLをセットしておきます。
{
    setcookie("yahoo_callback", $_GET["callback"]); // クッキーに保存します。
}

if($_COOKIE["yahoo_callback"])
{
    $config["callback_url"] = $_COOKIE["yahoo_callback"]; // クッキーのコールバックを引数にセットします。
}

new Opauth($config);
0
0
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
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?