Всем Доброго! Решаю задачу авторизации в игре на Unity3d, где все данные хранятся в базе сайта WP. Если с обычной базой на статичном сайте все без проблем ,то здесь немного темный лес. Сайт отвечает на запросы в базу из игры, но как то не корректно. Что было сделано: -В Unity на объект помещен скрипт для отправки полей: email и pass , а в корень сайта поместили файл login.php. Он соединяется с базой и обрабатывает вызов. Также в wp в файле функций для этого файла написал код инициализации. Но перехватить email и pass не получается, скрипт в Unity показывает полученные данные но не открывает игру. Помогите разобраться может у кого есть какие соображения.
Код в файле функции
add_action( 'init', 'check_auth' ); function check_auth() { $command=$_POST['command']; switch($command) { case "logined": $user_email=$_POST['user_email']; //из строк Unity $user_pass=$_POST['user_pass']; //из строк Unity $return = wp_authenticate( $user_email, $user_pass ); if ( is_wp_error( $return ) ) { wp_send_json_error(); } else { wp_send_json($return); } } }
Код файла login.php
<?php if(isset($_POST["user_email"]) && isset($_POST["user_pass"])){ $errors = array(); $user_email = $_POST["user_email"]; $user_pass = $_POST["user_pass"]; //Connect to database require dirname(__FILE__) . '/wp-config.php'; if ($stmt = $mysqli_conection->prepare("SELECT user_nicename, user_email, user_pass FROM wp_users WHERE email = ? LIMIT 1")) { /* привязать параметры для маркеров */ $stmt->bind_param('s', $user_email); /* выполнить запрос */ if($stmt->execute()){ /* сохранить результат */ $stmt->store_result(); if($stmt->num_rows > 0){ /* привязать переменные результата */ $stmt->bind_result( $user_email_tmp, $user_pass_hash); /* получить значение */ $stmt->fetch(); if(password_verify ($user_pass, $user_pass_hash)){ echo "Success" . "|" . $user_nicename_tmp . "|" . $user_email_tmp; return; }else{ $errors[] = "Неправильный адрес электронной почты или пароль."; } }else{ $errors[] = "Неправильный адрес электронной почты или пароль."; } /* закрыть заявление */ $stmt->close(); }else{ $errors[] = "Что-то пошло не так. Пожалуйста, попытайтесь еще раз."; } }else{ $errors[] = "Что-то пошло не так. Пожалуйста, попытайтесь еще раз."; } if(count($errors) > 0){ echo $errors[0]; } }else{ echo "Отсутствуют данные"; } ?>
Код скрипта в Unity
using System.Collections; using UnityEngine; using UnityEngine.Networking; public class SC_LoginSystem : MonoBehaviour { public enum CurrentWindow { Login } public CurrentWindow currentWindow = CurrentWindow.Login; public GameObject LoginSystem; public GameObject Menu; string loginEmail = ""; string loginPassword = ""; string errorMessage = ""; bool isWorking = false; bool registrationCompleted = false; bool isLoggedIn = false; //Данные авторизованного пользователя string userName = ""; string userEmail = ""; string rootURL = "**********"; //Путь, по которому находятся файлы php void OnGUI() { if (!isLoggedIn) { if (currentWindow == CurrentWindow.Login) { GUI.Window(0, new Rect(Screen.width / 2 - 300, Screen.height / 2 - 160, 580, 320), LoginWindow, "ФОРМА ВХОДА"); } } GUI.Label(new Rect(5, 5, 500, 25), "Status: " + (isLoggedIn ? "Logged-in Username: " + userName + " Email: " + userEmail : "Logged-out")); if (isLoggedIn) { Menu.SetActive(true); LoginSystem.SetActive(false); if (GUI.Button(new Rect(5, 30, 100, 25), "ВЫЙТИ")) { isLoggedIn = false; userName = ""; userEmail = ""; currentWindow = CurrentWindow.Login; Menu.SetActive(true); } } } void LoginWindow(int index) { if (isWorking) { GUI.enabled = false; } if (errorMessage != "") { GUI.color = Color.red; GUILayout.Label(errorMessage); } if (registrationCompleted) { GUI.color = Color.green; GUILayout.Label("Registration Completed!"); } GUI.color = Color.white; GUILayout.Label("Email:"); loginEmail = GUILayout.TextField(loginEmail); GUILayout.Label("Password:"); loginPassword = GUILayout.PasswordField(loginPassword, '*'); GUILayout.Space(5); if (GUILayout.Button("Submit", GUILayout.Width(85))) { StartCoroutine(LoginEnumerator()); } } IEnumerator LoginEnumerator() { isWorking = true; registrationCompleted = false; errorMessage = ""; WWWForm form = new WWWForm(); form.AddField("command", "logined"); form.AddField("user_email", loginEmail); form.AddField("user_pass", loginPassword); using (UnityWebRequest www = UnityWebRequest.Post(rootURL + "login.php", form)) { yield return www.SendWebRequest(); if (www.isNetworkError) { errorMessage = www.error; } else { string responseText = www.downloadHandler.text; if (responseText.StartsWith("Success")) { string[] dataChunks = responseText.Split('|'); userName = dataChunks[1]; userEmail = dataChunks[2]; isLoggedIn = true; ResetValues(); } else { errorMessage = responseText; } } } isWorking = false; } void ResetValues() { errorMessage = ""; loginEmail = ""; loginPassword = ""; } }
Сайт отвечает на запросы в базу из игры, но как то не корректно.
Как то не очень информативно. Что отвечает и что ожидаете в ответе?
Ну и для чего вам нужен такой функционал? Если только авторизовать юзера, а затем в конце игры или когда-то редко послать сообщение на сайт, например что юзер прошел уровень и т.п. - то я бы это делал через
Если же вам надо чаще общаться с сервером и нужен только доступ к базе - гуглите про константу SHORTINIT
Как то не очень информативно. Что отвечает и что ожидаете в ответе?
Нужны все данные какие есть на игрока. Они все выводятся, но кодом в файле functions.php и авторизация не происходит.
Ну и для чего вам нужен такой функционал?
Сам сайт это соц сеть и все возможности хочу перенести в игру. Пример подаренный подарок будет виден в рамке на стене, в доме игрока. Купленная вещь на сайте появляется в игре. Игра социальная, смесь монополии и мафии.
Ну для этого достаточно по сути 1го запроса в апи - авторизовать юзера и получить все его предметы, которые будете в игре размещать.
Непонятно для чего тогда вы создали свой файл и обращаетесь к нему. Обращайтесь к REST API или admin-ajax.php
Ну и функция wp_authenticate не авторизует юзера, она просто возвращает объект юзера если логин / пароль верные. Для авторизации используйте wp_set_auth_cookie
Или еще можно использовать wp_signon
Но тогда надо будет при ajax запросе на admin-ajax.php передавать и куки. Тогда можно будет 1 раз авторизоваться и при следующих входах в игру повторной авторизации не нужно будет. Единственное вам надо будет как то хранить куки и подгружать их при входе в игру, перед отправкой запроса на сайт. Не знаю можно ли это в Unity или нет