Домой WordPress WordPress: Проблемы и решения Авторизация из unity на сайте wp
6ответ(ов) в теме
Wasp
не в сети 9 месяцев
На сайте с 31.05.2019
Участник
Тем 17
Сообщения 49
1
15:35

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

0
Preci
не в сети 4 дня
На сайте с 11.11.2014
Участник
Тем 71
Сообщения 1646
2
18:47

Сайт отвечает на запросы в базу из игры, но как то не корректно.

Как то не очень информативно. Что отвечает и что ожидаете в ответе?

Ну и для чего вам нужен такой функционал? Если только авторизовать юзера, а затем в конце игры или когда-то редко послать сообщение на сайт, например что юзер прошел уровень и т.п. - то я бы это делал через

Вы не можете просматривать опубликованные ссылки

Если же вам надо чаще общаться с сервером и нужен только доступ к базе - гуглите про константу SHORTINIT

0
Wasp
не в сети 9 месяцев
На сайте с 31.05.2019
Участник
Тем 17
Сообщения 49
3
19:34

Как то не очень информативно. Что отвечает и что ожидаете в ответе?

Нужны все данные какие есть на игрока. Они все выводятся, но кодом в файле functions.php и авторизация не происходит.

Ну и для чего вам нужен такой функционал?

Сам сайт это соц сеть и все возможности хочу перенести в игру. Пример подаренный подарок будет виден в рамке на стене, в доме игрока. Купленная вещь на сайте появляется в игре. Игра социальная, смесь монополии и мафии.

0
Preci
не в сети 4 дня
На сайте с 11.11.2014
Участник
Тем 71
Сообщения 1646
4
19:42

Ну для этого достаточно по сути 1го запроса в апи - авторизовать юзера и получить все его предметы, которые будете в игре размещать.

Непонятно для чего тогда вы создали свой файл и обращаетесь к нему. Обращайтесь к REST API или admin-ajax.php

Ну и функция wp_authenticate не авторизует юзера, она просто возвращает объект юзера если логин / пароль верные. Для авторизации используйте wp_set_auth_cookie

0
Preci
не в сети 4 дня
На сайте с 11.11.2014
Участник
Тем 71
Сообщения 1646
5
19:45

Или еще можно использовать wp_signon

Но тогда надо будет при ajax запросе на admin-ajax.php передавать и куки. Тогда можно будет 1 раз авторизоваться и при следующих входах в игру повторной авторизации не нужно будет. Единственное вам надо будет как то хранить куки и подгружать их при входе в игру, перед отправкой запроса на сайт. Не знаю можно ли это в Unity или нет

0
Wasp
не в сети 9 месяцев
На сайте с 31.05.2019
Участник
Тем 17
Сообщения 49
6
11:47

Благодарю за помощь. Сейчас разбираюсь с REST API с авторизацией через Application Passwords по вашему совету.

0
Вы не имеете права на публикацию сообщений в этой теме