Всем Доброго! Решаю задачу авторизации в игре на 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 или нет