Logowanie do Allegro REST API

Wszystkie teoretyczne informacje na temat autoryzacji aplikacji, logowania itp. znajdziecie na oficjalnej stronie Allegro REST API, dlatego tutaj skupię się tylko na praktyce.

Spora grupa początkujących programistów ma problem ze zrozumieniem procesu logowania przez OAuth2.

Wychodząc naprzeciw oczekiwaniom osób, które pragną skorzystać z nowych funkcji Allegro, udostępniam autorską klasę, która może posłużyć za bazę do dalszego rozbudowywania.

Definicja klasy

/**
 * @author AlleREST.pl
 * @link http://allerest.pl/logowanie-do-allegro-rest-api/
 */
class AllegroOAuth2Client {

  protected $providerSettings = [
    'ClientId' => '*** Twój Client ID  ***',
    'ClientSecret' => '*** Twój Client Secret ***',
    'ApiKey' => '*** Twój API Key ***',
    'RedirectUri' => '*** Twój Redirect URI Key ***',

    'AuthorizationUri' => 'https://ssl.allegro.pl/auth/oauth/authorize',
    'TokenUri' => 'https://ssl.allegro.pl/auth/oauth/token'
  ];

  protected $headers = [
    'Content-Type: application/x-www-form-urlencoded'
  ];

  public function __construct(array $customSettings = []) {
    $this->providerSettings = array_merge($this->providerSettings, $customSettings);
    $this->headers[] = 'Authorization: Basic '. base64_encode($this->providerSettings['ClientId'] . ':' . $this->providerSettings['ClientSecret']);
  }

  public function tokenRequest($code) {
    $curl = curl_init($this->providerSettings['TokenUri']);

    curl_setopt($curl, CURLOPT_HTTPHEADER, $this->headers);
    curl_setopt($curl, CURLOPT_POST, true);
    curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);

    curl_setopt($curl, CURLOPT_POSTFIELDS, http_build_query([
      'grant_type' => 'authorization_code',
      'code' => $code,
      'api-key' => $this->providerSettings['ApiKey'],
      'redirect_uri' => $this->providerSettings['RedirectUri']
    ]));	

    $result = ($result = curl_exec($curl)) === false ? false : json_decode($result);

    if ($result === false) {
      throw new Exception('Unrecognized error');
    } else if (!empty($result->error)) {
      throw new Exception($result->error . ' - ' . $result->error_description);
    } else {
      return $result;
    }
  }

  public function getAuthorizationUri() {
    return $this->providerSettings['AuthorizationUri'] . '?' . http_build_query([
      'response_type' => 'code',
      'client_id' => $this->providerSettings['ClientId'],
      'api-key' => $this->providerSettings['ApiKey'],
      'redirect_uri' => $this->providerSettings['RedirectUri']
    ]);
  }
}

Przykład logowania

// Indywidualne parametry można podać do konstruktora w postaci tablicy, lub bezpośrednio w definicji klasy.
$auth = new AllegroOAuth2Client();

// Dobrze byłoby sprawdzić od kogo przychodzi żądanie
if (!empty($_GET['code'])) {
  try
  {
    $result = $auth->tokenRequest($_GET['code']);
    echo 'Twój Access Token: ' . $result->access_token . '.';
  }
  catch(Exception $e)
  {
    echo $e->getMessage();
  }
} else {
  echo '<a href="'.$auth->getAuthorizationUri().'">Zaloguj do Allegro</a>';
}

Dyskusja

Na forum http://allerest.pl/forum/viewtopic.php?id=5.

Comments are closed.