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


サイトにSNSログインボタンなどを設置

fb_oauth2_13
クライアントはFacebookからIDなどを発行してもらいました。Facebookでのログインボタンのリンクは、Facebookに指定されたリンク先とパラメータを付与して作ります。
ユーザさんはこのリンク先になったログインボタンをクリックし、しばらくFacebookとのやり取りを行います。リンクには戻り先のURLもパラメータとして付与するので、ユーザさんとFacebookのやり取りが終わると自分のサイトに戻ってきます。
fb_oauth2_15【参考】Facebook Developer >> Manually Build a Login Flow

APIのリンク先は以下になります。

https://www.facebook.com/dialog/oauth

必須パラメータは以下の2つです。

  • client_id
    Facebook Developerでアプリ登録したときに発行してもらったIDです。
  • redirect_uri
    ユーザさんとFacebookのやり取りが終わったときに自分のサイトに戻ってくるURIを指定します。指定したURIにFacebook側がユーザさんとのやり取りの結果を付与して戻してくれます。

また、オプション項目は以下の通りです。今回はアクセストークンまでの処理の流れを作りたいので詳しくみないですが、また別で記事にしたいと思います。ユーザさんのプロフィールなどを取得することが多いと思うので「scope」を設定することが多いと思います。
fb_oauth2_16

サンプル

fb_oauth2_17

今回は以下のパラメータにしました。スコープにはメールアドレスと誕生日も取得可能にしました。パラメータは各自環境で置き換えてください。

client_id hogehogehoge
redirect_uri http://192.168.33.11/demo/oauth/fb/sample01.php
scope email,user_birthday

https://www.facebook.com/dialog/oauth

に上記パラメータを付与したURLは以下になります。パラメータはurlエンコードしておきます。

https://www.facebook.com/dialog/oauth?client_id=hogehogehoge&redirect_uri=http%3A%2F%2F192.168.33.11%2Fdemo%2Foauth%2Ffb%2Fsample01.php&scope=email%2Cuser_birthday

このURLをFacebookログインボタンやリンクなどのリンク先として設定します。

サンプルコード

完成サンプル:GitHub

【sample01.php】

<?php
define('APP_ID', 'hogehogehoge');
define('REDIRECT_URI', 'http://sample.com');

include_once("lib/fb_api_dialog_oauth.php");

$paramsDialogOauth = new ParamsDialogOauth();
$paramsDialogOauth->setParams(APP_ID , REDIRECT_URI);
$paramsDialogOauth->setScope('email,user_birthday');

header('Content-type: text/html; charset=utf-8');
echo sprintf('&lt;a href="%s"&gt;OAuth Link&lt;/a&gt;' , ApiDialogOauth::getDialogOAuthUri($paramsDialogOauth));

以下の行は各自の環境に合わせて変更してください。

define('APP_ID', 'hogehogehoge');
define('REDIRECT_URI', 'http://sample.com');

今回はただのログインリンクにしました。ParamsDialogOauthクラスが API:dialog/oauth のロジッククラスです。単に必要パラメータを渡して、URLを取得しaタグに表示させています。

【fb_api_dialog_oauth.php】
<?php
/**
 * API : dialog/oauth
 *
 * @see https://developers.facebook.com/docs/facebook-login/manually-build-a-login-flow/v2.3
 */
class ApiDialogOauth
{
  const API_URI = "http://www.facebook.com/dialog/oauth";

  const ADO_ERROR_PARAMS_EMPTY    = "Api dialog/oauth empty params.";
  const ADO_REQUIRED_CLIENT_ID    = "Api dialog/oauth required client_id.";
  const ADO_REQUIRED_REDIRECT_URI = "Api dialog/oauth required redirect_uri.";

  public static function getDialogOAuthUri(ParamsDialogOauth $params = null){
    $apiParams = array();

    if(is_null($params)){
      throw new Exception(self::ADO_ERROR_PARAMS_EMPTY);
    }elseif("" === ($apiParams['client_id'] = $params->getClientId())){
      throw new Exception(self::ADO_REQUIRED_CLIENT_ID);
    }elseif("" === ($apiParams['redirect_uri'] = $params->getRedirectUri())){
      throw new Exception(self::ADO_REQUIRED_REDIRECT_URI);
    }
    $apiParams['response_type'] = $params->getResponseType();
    $apiParams = array_filter($apiParams);

    $uri = self::API_URI . '?' . http_build_query($apiParams);
    return $uri;
  }
}

class ParamsDialogOauth
{
  const VALID_CLIENT_ID     = "Param dialog/oauth valid client id.";
  const VALID_REDIRECT_URL  = "Param dialog/oauth valid redirect url.";
  const VALID_SCOPE         = "Param dialog/oauth valid scope.";
  const VALID_RESPONSE_TYPE = "Param dialog/oauth valid response type.";
  const VALID_STATE         = "Param dialog/oauth valid state.";

  private $clientId     = "";
  private $redirectUri  = "";
  private $scope        = "";
  private $responseType = "";
  private $state        = "";

  public function setParams($clientId = "", $redirectUri = "" ,
                    $scope = "" , $responseType = "" , $state = ""){
    $this->setClientId($clientId);
    $this->setRedirectUri($redirectUri);
    $this->setScope($scope);
    $this->setResponseType($responseType);
    $this->setState($state);
  }

  /**
   * client_id
   */
  public function getClientId(){
    return $this->clientId;
  }

  public function setClientId($val = ""){
    if(!is_string($val)){
      throw new Exception(self::VALID_CLIENT_ID);
    }
    $this->clientId = $val;
  }

  /**
   *  redirect_uri
   */
  public function getRedirectUri(){
    return $this->redirectUri;
  }

  public function setRedirectUri($val = ""){
    if(!is_string($val)){
      throw new Exception(self::VALID_REDIRECT_URL);
    }
    $this->redirectUri = $val;
  }

  /**
   *  scope
   */
  public function getScope(){
    return $this->scope;
  }

  public function setScope($val = ""){
    if(!is_string($val)){
      throw new Exception(self::VALID_SCOPE);
    }
    $this->scope = $val;
  }

  /**
   *  response_type
   */
  public function getResponseType(){
    return $this->responseType;
  }

  public function setResponseType($val = ""){
    if(!is_string($val)){
      throw new Exception(self::VALID_RESPONSE_TYPE);
    }
    $this->responseType = $val;
  }

  /**
   *  state
   */
  public function getState(){
    return $this->state;
  }

  public function setState($val = ""){
    if(!is_string($val)){
      throw new Exception(self::VALID_STATE);
    }
    $this->responseType = $val;
  }
}

こちらは、ApiDialogOauthクラスとParamsDialogOauthクラスを作りました。ApiDialogOauthクラスが実際にAPI処理をするクラスで、ParamsDialogOauthはただのAPIパラメータのアクセサです。
コードは非常に長いですが、やってることは単にパラメータをurlエンコードしてurlを作ってるだけです。
fb_oauth2_18
次ページではリンクをクリックしたときの処理をみていきます。


[facebook API 関連記事]

コメントを残す

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