Yahoo連携!SDKを使わずにOAuth2でアクセストークン取得する/PHP


ユーザさんの同意結果を受け取る

yahoo_oauth2_13
ユーザさんはサービスプロバイダーへのリンクの貼ったログインボタン(リンク)をクリックします。Yahoo!ではリンクのパラメータのIDなどをみて、どのクライアントがユーザのアカウントを使いたいか調べます。また、パラメータをみてクライアントが操作できる権限を確認しユーザさんにこれらの権限を使わせてよいか確認します。Yahoo!はユーザーさんの同意結果を戻り先にパラメータとして送ります。

yahoo_oauth2_14

ユーザさんはログインボタン(リンク)をクリックします。まだ、Yahoo!にログインしていない場合は先にYahoo!へのログイン画面が表示されます。ログインしたらスコープ範囲(クライアントの権限)についてユーザさんに情報を渡してよいか確認があります。「同意してはじめる」と「同意しない」があり、ユーザさんが同意すればリダイレクト先にパラメータを付与して返します。

※一旦ユーザさんが承認すれば、スコープ(権限)変更しないと次からはでなくなります。
※ユーザさんが「同意しない」をクリックしたときの遷移先は、API:Authorizationエンドポイントのパラメータbailの設定により変わります。
※「client_id is invalid」が表示された場合はこちら
※「redirect_uri is invalid」が表示された場合はこちら

ユーザさんが「同意してはじめる」をクリックした場合

yahoo_oauth2_15

http://192.168.33.11/demo/oauth/yahoo/sample01.php?code=hogehoge&state=

今回の例ではYahoo!からリダイレクトされてきたURLは上記のようになってます。redirect_urlで指定したURLにユーザさんがOK出したのでコードを付与されています。

ユーザさんが「同意しない」をクリックした場合

yahoo_oauth2_16
API:Authorizationエンドポイントのパラメータ bailの設定により戻り先が変わります。「bail=1」指定したときの戻り先はredirect_uriで指定したURL(※codeパラメータなし)になります。「bail=1」を指定しない場合はYahoo!トップへ遷移します。

client_id is invalid.

yahoo_oauth2_17
上記エラーが出た場合、Yahoo!デベロッパーネットワークでアプリ登録したときに発行されるアプリIDがYahoo!側でみつかりません。
yahoo_oauth2_18
Yahoo!デベロッパーネットワークにアクセスして登録したアプリのIDと一致しているか確認します。

redirect_uri is invalid.

yahoo_oauth2_19
リダイレクトで指定したURLがYahoo!デベロッパーネットワークで登録したURLと違うとのこと。
yahoo_oauth2_20
Yahoo!デベロッパーネットワークで登録されているコールバックURL に一致するURLがあるか確認します。

サンプルコード

完成サンプル:GitHub

【ya_api_authorization.php >> ResponseYaAuthorization クラス】

class ResponseYaAuthorization
{
  const VALID_RESPONSE_FORMAT = "Response ya/authorization valid format.";

  private $state            = "";
  private $code             = "";
  private $error            = "";
  private $errorDescription = "";

  public static function isResponse(){
    if(empty($_GET['code']) && empty($_GET['error'])){
      return false;
    }else{
      return true;
    }
  }

  public function setResponse(){
    if(! self::isResponse()){
      throw new Exception(self::VALID_RESPONSE_FORMAT . ":required valid.");
    }
    foreach(
      array('status' , 'code' , 'error' , 'errorDescription') as $camelKey)
    {
      $getMethodKey = trim(strtolower(preg_replace("/([A-Z])/u", "_$0", $camelKey)) , '_');
      if(! array_key_exists($getMethodKey , $_GET)){
        continue;
      }
      $val = $_GET[$getMethodKey];
      if(!is_string($val)){
        throw new Exception(self::VALID_RESPONSE_FORMAT . ":{$getMethodKey}");
      }
      $this->{$camelKey} = $val;
    }
  }

  public function getStatus(){
    return $this->status;
  }

  public function getCode(){
    return $this->code;
  }

  public function getError(){
    return $this->error;
  }

  public function getErrorDescription(){
    return $this->errorDescription;
  }
}

リダイレクト先にGETメソッドで戻ってきます。ユーザーさんがが同意した場合は、「code」と「state」をパラメータとして付与され、エラーがある場合は、「error」「error_description」と「state」が付与されます。
※client_id不正とredirect_uri不正はYahoo!エラー画面が表示されます。

【sample01.php】

<?php
/**
 *  Yahoo! API を使ってアクセストークンを取得するサンプル
 * 
 *   ※ SDKは使わずにOAuth2を利用したサンプル
 */

/** 各環境にあわせて変更してくさい. START */
define('APP_ID', 'hogehoge');
define('REDIRECT_URI', 'http://192.168.33.11/demo/oauth/yahoo/sample01.php');
/** 各環境にあわせて変更してくさい. END */

include_once("lib/ya_api_authorization.php");

$paramsYaAuthorization = new ParamsYaAuthorization();
$paramsYaAuthorization->setResponseType('code');
$paramsYaAuthorization->setClientId(APP_ID);
$paramsYaAuthorization->setRedirectUri(REDIRECT_URI);
$paramsYaAuthorization->setScope('openid profile2');
$paramsYaAuthorization->setBail(1);

try {
  if(ResponseYaAuthorization::isResponse()){
    $responseYaAuthorization = new ResponseYaAuthorization();
    $responseYaAuthorization->setResponse();
    if('' !== ($error = $responseYaAuthorization->getError())){
      echo $error;
    }else{
      $code = $responseYaAuthorization->getCode();
      echo $code;
    }
    exit;
  }
  $loginUrl = YaApiAuthorization::getAuthorizationUri($paramsYaAuthorization);
} catch (Exception $e) {
  echo $e->getMessage();
  echo '

<hr>

' . $e->getTraceAsString();
  exit;
}
header('Content-type: text/html; charset=utf-8');
echo sprintf('<a href="%s">OAuth Link</a>' , $loginUrl);

$responseYaAuthorization = new ResponseYaAuthorization(); でYahoo!からのレスポンス結果を受け取ってます。その後、エラーがあればエラー表示、コード取得できれば(ユーザがOK)ならコードを表示しているだけのサンプルです。

次ページでは、このコードを使ってアクセストークンを取得します。


コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です