0

I'm tring to login with Blizzard ID in my site. I think my code is work. User profile request failed. I don't understand Blizzard's user profile Data structure. Can you help me to get user's Id, Email and Battle Tag?

Here's my code

<?php
class Hybrid_Providers_Kakao extends Hybrid_Provider_Model_OAuth2
{
/**
* initialization
*/
function initialize()
{
    parent::initialize();

    // Provider API end-points
    $this->api->api_base_url  = "https://kr.api.battle.net/";
    $this->api->authorize_url = "https://kr.battle.net/oauth/authorize";
    $this->api->token_url     = "https://kr.battle.net/oauth/token";

    // redirect uri mismatches when authenticating with Battle.
    if (isset($this->config['redirect_uri']) && !empty($this->config['redirect_uri'])) {
        $this->api->redirect_uri = $this->config['redirect_uri'];
    }
}

/**
* finish login step
*/
function loginFinish()
{
    $error = (array_key_exists('error', $_REQUEST)) ? $_REQUEST['error'] : "";
    // check for errors
    if ( $error ){
        throw new Exception( "Authentication failed! {$this->providerId} returned an error: $error", 5 );
    }
    // try to authenicate user
    $code = (array_key_exists('code', $_REQUEST)) ? $_REQUEST['code'] : "";
    try{
        $this->authenticate( $code );
    }
    catch( Exception $e ){
        throw new Exception( "User profile request failed! {$this->providerId} returned an error: $e", 6 );
    }
    // check if authenticated
    if ( ! $this->api->access_token ){
        throw new Exception( "Authentication failed! {$this->providerId} returned an invalid access token.", 5 );
    }
    // store tokens
    $this->token("access_token",  $this->api->access_token);
    $this->token("refresh_token", $this->api->refresh_token);
    $this->token("expires_in",    $this->api->access_token_expires_in);
    $this->token("expires_at",    $this->api->access_token_expires_at);
    // set user connected locally
    $this->setUserConnected();
}

/**
* load the user profile
*/
function getUserProfile()
{

    $this->api->decode_json = false;
    $this->api->curl_header = array( 'Authorization: Bearer ' . $this->api->access_token );

    $data = $this->api->api("account/profile", "POST");

    if ( ! isset( $data->id ) ) {
        throw new Exception("User profile request failed! {$this->providerId} returned an invalid response.", 6);
    }
    # store the user profile.
    $this->user->profile->identifier  = @ $data->id;
    $this->user->profile->displayName = @ $data->battletag;
    return $this->user->profile;
}

private function authenticate($code)
{
    $params = array(
        "response_type" => $code,
        "grant_type"    => "authorization_code",
        "client_id" => $this->api->client_id,
        "redirect_uri" => $this->api->redirect_uri,
        "state" => $token,
        "scope" => "sc2.profile",
    );

    if( $this->api->client_secret && ($this->api->client_secret !== $this->api->client_id) ){
        $params['client_secret'] = $this->api->client_secret;
    }

    $response = $this->request($this->api->token_url, $params, $this->api->curl_authenticate_method);
    $response = $this->parseRequestResult($response);
    if ( ! $response || ! isset($response->access_token) ) {
        throw new Exception("The Authorization Service has return: " . $response->error);
    }
    if ( isset($response->access_token) )  $this->api->access_token            = $response->access_token;
    if ( isset($response->refresh_token) ) $this->api->refresh_token           = $response->refresh_token;
    if ( isset($response->expires_in) )    $this->api->access_token_expires_in = $response->expires_in;

    // calculate when the access token expire
    if ( isset($response->expires_in) ) {
        $this->api->access_token_expires_at = time() + $response->expires_in;
    }

    return $response;
}

private function request($url, $params=false, $type="GET")
{
    if(Class_exists('Hybrid_Logger')){
        Hybrid_Logger::info("Enter OAuth2Client::request( $url )");
        Hybrid_Logger::debug("OAuth2Client::request(). dump request params: ", serialize( $params ));
    }
    $this->http_info = array();
    $ch = curl_init();

    curl_setopt($ch, CURLOPT_URL           , $url);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($ch, CURLOPT_TIMEOUT       , $this->api->curl_time_out);
    curl_setopt($ch, CURLOPT_USERAGENT     , $this->api->curl_useragent);
    curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, $this->api->curl_connect_time_out);
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, $this->api->curl_ssl_verifypeer);
    curl_setopt($ch, CURLOPT_HTTPHEADER    , $this->api->curl_header);

    if ( $this->api->curl_proxy ) {
        curl_setopt( $ch, CURLOPT_PROXY, $this->curl_proxy);
    }
    if ( $type == "POST" ) {
        curl_setopt($ch, CURLOPT_POST, 1);
        if ($params) curl_setopt( $ch, CURLOPT_POSTFIELDS, http_build_query($params) );
    }

    $response = curl_exec($ch);
    if(Class_exists('Hybrid_Logger')){
        Hybrid_Logger::debug( "OAuth2Client::request(). dump request info: ", serialize(curl_getinfo($ch)) );
        Hybrid_Logger::debug( "OAuth2Client::request(). dump request result: ", serialize($response ));
    }
    $this->http_code = curl_getinfo($ch, CURLINFO_HTTP_CODE);
    $this->http_info = array_merge($this->http_info, curl_getinfo($ch));
    curl_close ($ch);

    return $response;
}

private function parseRequestResult($result)
{
    if ( json_decode($result) ) return json_decode($result);
    parse_str( $result, $ouput );
    $result = new StdClass();
    foreach( $ouput as $k => $v )
        $result->$k = $v;

    return $result;
}
}

I think this code can't read user id

    $this->user->profile->identifier  = @ $data->id;
    $this->user->profile->displayName = @ $data->battletag;

on this part.

It's not pure HybridAuth.

정도윤
  • 1
  • 1
  • If you don't understand their rest api, did you check their api reference? – Capricorn Aug 03 '18 at 15:42
  • I checked here. https://dev.battle.net/docs/read/oauth – 정도윤 Aug 03 '18 at 15:53
  • I haven't tested your code, but noticed your use of `kr` in the URI which is deprecated per the docs. "Where the is one of the following: us, eu, or `apac`. APAC is short for Asia-Pacific and replaces the previous `kr` and `tw` regions." – Jed Burke Aug 03 '18 at 16:36
  • https://imgur.com/a/mmoK5gH Authorizations Succeed and I received the mail " has approved access to Blizzard account information." but my site said "User profile request failed. Most likely the user is not connected to the provider and he should to authenticate again." – 정도윤 Aug 04 '18 at 02:02

0 Answers0