2015-07-01 3 views
2

Недавно я перешел из Apache Basic Auth в Google OAuth2. Ранее $_SERVER['PHP_AUTH_USER'] использовался для установки в соответствии с введенной информацией пользователя. Теперь, когда моя страница страницы показывает signIn с Google, $_SERVER['PHP_AUTH_USER'] не устанавливается. Я могу печатать информацию о пользователе на консоли, используя

<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()) 

; Однако мой контроль доступа осуществляется через пользовательские данные. например. если пользователь == ABC => добавьте его в белый список, , если пользователь == XYZ => добавьте его в черный список и т. д. До того, как google oauth было сделано с использованием $_SERVER['PHP_AUTH_USER'].

Хотя у меня есть эта информация для печати на консоли, мне нужно это, чтобы проверить, какое содержимое должно быть показано пользователю, и что скрывать. Информация о том, как использовать эту сторону информационного сервера, отсутствует. Единственный способ (который, я думаю, не правильный путь, это отправить информацию о пользователе обратно на сервер). Ниже приведен код, который я пробовал установить $_SERVER variable, но, похоже, должен быть лучший способ сделать это. Даже это не работает.

<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()); 
    var emailid = profile.getEmail(); 
     //window.location.href = "myphpfile.php?name=" + emailid;//tried this aswell 
     $.ajax({      
      url: 'myphpfile.php',  
      type: 'post', // performing a POST request 
      data : {email:emailid}, 
      dataType: 'text',     
      success: function(data)   
      { 


       console.log(data); //nothing gets printed here 

      } 

Я также хотел бы ничего не показывать, пока пользователь не зайдет с помощью google. Хотя это можно сделать позже. Но в данный момент мое ограничение пользователь не потому, что я не могу найти, кто является пользователем, который подписал в myfile.php. ->

<?php 
session_start(); 
$abc=$_POST['email']; 
echo "$abc"; 
$_SESSION["PHP_AUTH_USER"] = $abc; 
$_SERVER["PHP_AUTH_USER"] = $abc; 
?> 

Мне просто нужно, чтобы получить электронный идентификатор и посмотреть, если пользователь должен быть обеспечен доступ или нет.

+0

Почему вы используете проверка подлинности на стороне клиента, когда вся ваша логика аутентификации существует на стороне сервера? Вы можете интегрироваться с API OAuth с сервера. –

+0

Раньше нам приходилось хранить пароль пользователя в зашифрованном виде на сервере. Поэтому каждый раз, когда пользователь меняет пароль, мы должны были внести изменения. Но при входе в Google, проверка пароля выполняется Google. Нам нужно только предоставить ограничения доступа в соответствии с пользователем, который зарегистрировался в – user1977867

+1

. Я понимаю, что вы используете OAuth для (сторонняя проверка подлинности), но не знаете, почему вы выбрали реализацию javascript на стороне клиента, а не реализацию на вашем сервер. Ваш серверный код может обрабатывать интеграцию API с Google, таким образом, ваш сервер может проверять ответ и применять соответствующие разрешения. –

ответ

0

использовать ajax после ввода (выполнить обратный вызов). Для этого google предлагает сценарий ajax.

<!-- BEGIN Pre-requisites --> 
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.8.2/jquery.min.js"> 
</script> 
<script src="https://apis.google.com/js/client:platform.js?onload=start" async defer> 
</script> 
<!-- END Pre-requisites --> 

то, что вы ищете объясняется in this google developer tutorial

<script> 
function signInCallback(authResult) { 
if (authResult['code']) { 

    // Hide the sign-in button now that the user is authorized, for example: 
    $('#signinButton').attr('style', 'display: none'); 

    // Send the code to the server 
    $.ajax({ 
    type: 'POST', 
    url: 'http://example.com/storeauthcode', 
    contentType: 'application/octet-stream; charset=utf-8', 
    success: function(result) { 
    // Handle or verify the server response. 
    }, 
    processData: false, 
    data: authResult['code'] 
    }); 
} else { 
    // There was an error. 
} 
} 
</script> 
0

еще один способ сделать это с помощью httprequests и скручиванию

<html lang="en"> 
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1"> 
    <head> 
    <meta name="google-signin-scope" content="profile email"> 
    <meta name="google-signin-client_id" content="<YOURclientID>"> 
    <script src="https://apis.google.com/js/platform.js" async defer></script> 
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.8.2/jquery.min.js"> 
</script> 
    <script> 
     function signOut() { 
     var auth2 = gapi.auth2.getAuthInstance(); 
     auth2.signOut().then(function() { 
      console.log('User signed out.'); 
     }); 
     } 
     function disassociate() { 
     var auth2 = gapi.auth2.getAuthInstance(); 
     auth2.disconnect().then(function() { 
      console.log('User disconnected from association with app.'); 
     }); 
    } 
     function onSignIn(googleUser) { 
      // Useful data for your client-side scripts: 
      var profile = googleUser.getBasicProfile(); 
      console.log("ID: " + profile.getId()); // Don't send this directly to your server! Use idToken below 
      console.log("Name: " + profile.getName()); 
      console.log("Image URL: " + profile.getImageUrl()); 
      console.log("Email: " + profile.getEmail()); 
      // The ID token you need to pass to your backend: 
      var id_token = googleUser.getAuthResponse().id_token; 
      var xhr = new XMLHttpRequest(); 
      xhr.open('POST', 'http://yourdomain/tokenIdRequest.php'); 
      xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded'); 
      xhr.onload = function() { 
       console.log('NEW Signed in as: ' + xhr.responseText); 
      }; 
      xhr.send('idtoken=' + id_token); 
      console.log("ID Token: " + id_token); 
     }; 
    </script> 
    </head> 
    <body> 
    <div id="login-button" class="g-signin2" data-onsuccess="onSignIn" data-theme="dark"></div> 
    <div><a href="#" onclick="signOut();">Sign out</a></div> 
    <div><a href="#" onclick="disassociate();">Disassociate App and Site (easily undone)</a></div> 
    </body> 
</html> 

и принимающий PHP может решить проблему с помощью функции поиска Googles API напрямую, отправляя токен доступа и получая всю информацию обратно. таким образом, избежать BruteForce имя взлома

<?php 
$inputRaw = file_get_contents('php://input'); 
$idToken= substr($inputRaw,8); 
//$fp = fopen('twoStepOutput.txt', 'a'); 
//fwrite($fp, date("DATA: YmdHis")."\r\n$idToken\r\n"); 
$url = 'https://www.googleapis.com/oauth2/v3/tokeninfo?id_token='.$idToken; 
$ch = curl_init($url); 
curl_setopt($ch, CURLOPT_POST, 1); 
curl_setopt($ch, CURLOPT_POSTFIELDS, $xml); 
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); 
$response = curl_exec($ch); 
$json = json_decode($response, true); 
curl_close($ch); 
//fwrite($fp, "response:[$json]\r\n"); 
print_r($json); // sends answer back to JS frontend 
//fclose($fp); 
?> 
0

Если вы все еще хотите сделать это с помощью PHP, вот как:

$client = new Google_Client(); 
$client->setClientId(CLIENT_ID); 
$client->setClientSecret(CLIENT_SECRET); 
$client->setScopes(['email', 'profile']); 

{authenticate...}

$oauth2Service = new Google_Service_Oauth2($client); 
$userinfo = $oauth2Service->userinfo->get(); 
$print_r($userinfo); // => name, email, etc. 
Смежные вопросы