Google login, javascript+php

Viestiketju alueella 'Ohjelmointi' , aloittaja jyrki, 01.10.2017.

  1. jyrki

    Rekisteröitynyt:
    14.12.1999
    Viestejä:
    812
    Moi

    Kyseessä siis googlen login nappula omalle sivulle jotta voidaan hyödyntää googlen kirjautumista ilman että omia käyttäjätunnuksia sivulla tarvitsee ylläpitää.

    Olen nyt takonut sen verran päätä seinään tämän kanssa että kysytään niiltä ketkä osaavat :D
    Tätä ohjetta olen seurannut:
    https://developers.google.com/identity/sign-in/web/sign-in
    https://developers.google.com/identity/sign-in/web/backend-auth

    Loginsivun koodi (olen vähän soveltanut epätoivossani niin se näyttää nyt tältä):

    Koodi:
    <script src="https://apis.google.com/js/platform.js" async defer></script>
    <html>
    <head>
       <meta name="google-signin-client_id" content="XXXXXXXX.apps.googleusercontent.com">
    </head>
    <div class="g-signin2" data-onsuccess="onSignIn"></div>
    <script>
    function onSignIn(googleUser) {
      var profile = googleUser.getBasicProfile();
      console.log('ID: ' + profile.getId()); // Do not send to your backend! Use an ID token instead.
      console.log('Name: ' + profile.getName());
      console.log('Image URL: ' + profile.getImageUrl());
      console.log('Email: ' + profile.getEmail()); // This is null if the 'email' scope is not present.
    
      var getAuthResponse = googleUser.getAuthResponse();
      console.log('Token: ' + getAuthResponse.id_token());
    
    var xhr = new XMLHttpRequest();
    var id_token = googleUser.getAuthResponse().id_token;
    xhr.open('POST', 'https://ol7dev1.com/googletokensignin.php');
    xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
    xhr.onload = function() {
      console.log('Signed in as: ' + xhr.responseText);
    };
    xhr.send('idtoken=' + id_token);
    
    }
    



    php-koodi minne post pitäisi tulla (googletokensignin.php):

    Koodi:
    require_once 'vendor/autoload.php';
    
    // Get $id_token via HTTPS POST.
    
    $client = new Google_Client(['client_id' => $CLIENT_ID]);
    $payload = $client->verifyIdToken($id_Token);
    if ($payload) {
      $userid = $payload['sub'];
    echo "Token success! $id_Token";
      // If request specified a G Suite domain:
      //$domain = $payload['hd'];
    } else {
    echo "Invalid ID token";
    }
    ?>
    

    Webserverin logiin tulee:
    [Sun Oct 01 18:30:10.785928 2017] [:error] [pid 3734] [client 192.168.0.3:42382] PHP Fatal error: Uncaught exception 'LogicException' with message 'id_token must be passed in or set as part of setAccessToken' in /var/www/html/vendor/google/apiclient/src/Google/Client.php:702\nStack trace:\n#0 /var/www/html/googletokensignin.php(9): Google_Client->verifyIdToken(NULL)\n#1 {main}\n thrown in /var/www/html/vendor/google/apiclient/src/Google/Client.php on line 702

    Herjan lähde löytyy täältä:
    https://github.com/google/google-api-php-client/blob/master/src/Google/Client.php


    Olenko nyt ihan hakoteillä miten tätä edes yritän tehdä?
    Google löysi samaa herjaa johon oli kysytty neuvoa mutta ei näkynyt ratkaisevaa vastausta :)
     
    Viimeksi muokattu: 01.10.2017
  2. Paapaa

    Rekisteröitynyt:
    14.04.2005
    Viestejä:
    10 933
    Jos nyt aluksi opettelet käyttämään code-tägejä ja muokkaat viestisi :think:
     
  3. telcoM

    Rekisteröitynyt:
    27.08.2015
    Viestejä:
    614
    Tuo virheilmoitus webserverin logissa näyttäisi sanovan että verifyIdToken-metodia on kutsuttu NULLin eli tyhjän arvon kanssa. Eli $id_Token muuttujassa ei nyt ole sitä mitä pitäisi.

    Jos ymmärsin oikein, login-sivu lähettää application/x-www-form-urlencoded muotoisena datana ainoastaan rivin "idtoken=<getAuthResponsella saadun ID-tokenin arvo>".

    Mutta sitten tuo googletokensignin.php olettaa että tuo arvo olisi jotenkin tullut muuttujaan nimeltä $id_Token.

    "id_Token" ei ole sama asia kuin "idtoken", eikä POST-operaatiolla lähetetyistä tiedosta tule automaattisesti samannimisiä muuttujia serveripään POST-operaation vastaanottokoodiin, vaan tiedot pitää kaivaa $_POST taulukkomuuttujan sisältä.

    Tuossa //Get $id_token via HTTPS POST -kommentin kohdalla pitää siis tehdä jotakin, vähintään kai jotain sen tapaista kuin:
    Koodi:
    function test_input($data) {
      $data = trim($data);
      $data = stripslashes($data);
      $data = htmlspecialchars($data);
      return $data;
    }
    
    $id_Token = test_input($_POST["idtoken"]);
    echo "Saatiin token: $id_Token";
    
    Eli tuossa otetaan POST-operaation tuoman "idtoken"-datakentän arvo, suodatetaan sitä vähän siltä varalta että joku ei-niin-valkohattuinen hakkeri tekee muokatun POST-operaation ja lähettää idtoken-tiedon paikalla jotain ilkeämpää, ja laitetaan se muuttujaan $id_Token.

    Lisäksi testausmielessä tulostetaan se vielä näkyviin jotta voidaan varmistua että tokenin välitys selaimesta palvelimelle ylipäätään toimii.
     
    Viimeksi muokattu: 03.10.2017

Jaa tämä sivu

Alibi
Anna
Deko
Dome
Erä
Hymy
Kaksplus
Kippari
Kotilääkäri
Kotiliesi
Koululainen
Ruoka.fi
Parnasso
Seura
Suomen Kuvalehti
TM Rakennusmaailma
Tekniikan Maailma
Vauhdin Maailma
Golfpiste
Vene
Nettiauto
Ampparit
Plaza
Muropaketti