2013-03-27 5 views
9

Próbuję dodać autoryzację Google+ do strony z wordpressami. Czego chcę: po autoryzacji w Google+, jeśli użytkownik nie jest zarejestrowany na stronie - przekierowuję go na stronę, na której wprowadza swoją nazwę użytkownika; jeśli użytkownik już zarejestrowany - to będzie zalogowany tutaj mój kod JS:Logowanie przez Google+ dla aplikacji po stronie serwera, które nie działają

function doGooglePlusLogin(authResult) { 
    if (authResult['code']) { 
     jQuery('#signinButton').attr('style', 'display: none'); 
     jQuery.ajax({ 
      url: '<?php echo site_url(); ?>/wp-admin/admin-ajax.php', 
      type: 'get', 
      dataType: 'json', 
      data: { 
       action: 'login_gplus', 
       code: authResult['code'] 
      }, 
      success: function(result) { 
      }, 
     }); 
    } else if (authResult['error']) { 
    } 
} 

tutaj mój kod php:

function login_gplus() { 
$response = array(); 

if (isset($_GET['code']) && !empty($_GET['code'])) { 
    @session_start(); 
    $client = new Google_Client(); 
    $client->setApplicationName('Test'); 
    $client->setAccessType('offline'); 
    $client->setClientId(get_option(SOCIAL_GPLUS_CLIENT_ID)); 
    $client->setClientSecret(get_option(SOCIAL_GPLUS_CLIENT_SECRET)); 
    $client->setDeveloperKey(get_option(SOCIAL_GPLUS_API_KEY)); 
    $client->setRedirectUri(get_option(SOCIAL_GPLUS_REDIRECT_URIS)); 
    $client->setApprovalPrompt('auto'); 

    $code = $_GET['code']; 
    $client->authenticate($code); 

    $token = json_decode($client->getAccessToken()); 
    $reqUrl = 'https://www.googleapis.com/oauth2/v1/tokeninfo?access_token=' . $token->access_token; 
    $req = new Google_HttpRequest($reqUrl); 

    $tokenInfo = json_decode(
      $client->getIo() 
        ->authenticatedRequest($req) 
        ->getResponseBody()); 

    if ($tokenInfo->error) { 
     $response['test'] = $tokenInfo->error; 
     send_json_response($response); 
     die(); 
    } 
    if ($tokenInfo->audience != get_option(SOCIAL_GPLUS_CLIENT_ID)) { 
     $response['test'] = "Token's client ID does not match app's."; 
     send_json_response($response); 
     die(); 
    } 
    $response['test'] = 'Succesfully connected with token: ' . print_r($token, true); 
} 
send_json_response($response); 
die(); 
} 

Użytkownik pomyślnie upoważnione w Google+, ale w php mam to:

.

Błąd krytyczny: nieprzechwycony wyjątek "Google_AuthException" z komunikatem "Błąd podczas pobierania tokenu dostępu OAuth2, wiadomość:" redirect_uri_mismatch "w/var/www/html/v4/wp-content/plugins/social/google-plus/google-api /auth/Google_OAuth2.php:113Trasa śledzenia: # 0/var/www/html/v4 /wp-content/plugins/social/google-plus/google-api/Google_Client.php(131): Google_OAuth2-> authenticate (Array, '4/ScmpTqEIWt0SJ ...') # 1/var/www/html/v4 /wp-content/plugins/social/google-plus/functions.php(35): Google_Client-> authenticate ('4/ScmpTqEIWt0SJ ...') # 2 [funkcja wewnętrzna]: login_gplus ('') # 3/var /www/html/v4/wp-includes/plugin.php(406): call_user_func_array ('login_gplus', Array) # 4 /var/www/html/v4/wp-admin/admin-ajax.php(74): do_action ('wp_ajax_nopriv _...') # 5 {główny} wrzucony na /var/www/html/v4/wp-content/plugins/social/google-plus/google-api/auth/Google_OAuth2.php on line 113

W ustawieniach aplikacji Przekierowanie identyfikatorów URI określonych jako http://example.com/wp-admin/admin-ajax.php. Co mam zrobić źle?

EDIT:

Google+ Sign-In definicji przycisku:

<span id="signinButton"> 
    <span class="g-signin" 
    data-callback="doGooglePlusLogin" 
    data-clientid="<?php echo $this->gplus_client_id; ?>" 
    data-cookiepolicy="single_host_origin" data-accesstype="offline" 
    data-requestvisibleactions="http://schemas.google.com/AddActivity" 
    data-scope="https://www.googleapis.com/auth/plus.login"> 
    </span> 
</span> 

SOCIAL_GPLUS_REDIRECT_URIS jest example.com/wp-admin/admin-ajax.php?action=login_gplus

+0

Czy używasz [przycisku logowania do Google+] (https://developers.google.com/+/web/signin/) lub sam jesteś inicjatorem przepływu? Proszę napisać swój kod front-end, który pokazuje, w jaki sposób uruchamiany jest ten przepływ. Musimy zobaczyć parametry konfiguracyjne przekazywane do Google. (ukryj swój identyfikator klienta. Musimy również zobaczyć na twojej stronie PHP, jakie wartości są obecne dla twojego SOCIAL_GPLUS_REDIRECT_URIS – BrettJ

+0

Używam przycisku logowania Google+. ' ' – Peter

+0

SOCIAL_GPLUS_REDIRECT_URIS jest http://example.com/wp-admin/admin-ajax.php?action=login_gplus – Peter

Odpowiedz

22

Kod jest w zasadzie w porządku, ale jest niewielki cokół, który widzę, nie jest udokumentowane bardzo dobrze! Musisz ustawić swój redirectURI na postmessage, a nie na adres URL, którego używasz.

$client->setRedirectUri('postmessage'); 

Jest to zgodne z identyfikatorem URI dla tokena podczas wymiany Javascript z przycisku. Spójrz na przykładowy kod pod adresem: https://github.com/googleplus/gplus-quickstart-php/blob/master/signin.php, aby zobaczyć go w akcji. Upewnię się, że dodamy notatkę do dokumentacji.

+1

Dziękuję za pomoc. Ty mnie uratować. – Peter

+2

OMG !!!! I spędź 8 godzin, zaglądając do kodu i próbując pozbyć się tego głupiego błędu 'redirect_uri_mismatch'! Spróbuj z kodowaniem, bez, http/https, rejestrując nową aplikację, różne subdomeny ..... o mój Boże, właśnie wstawiłem' postmessage' Zamiast tego, chłopaki Google, proszę go udokumentować !!!!! –

+0

Dziękuję, uratowałeś mnie też! Nic w dokumentacji Google. :( – Stocki

Powiązane problemy