Unity3d авторизация в WordPress (woocommerce)

254
30 марта 2017, 22:25

Делаю авторизацию в приложении Unity для своего поднятого сайта (магазина) на WordPress(woocommerce).

При вводе логина и пароля, приложение должно возвращать мне из БД id пользователя и его name. С логином все отлично совпадение есть, а вот c паролем проблема: совпадение не происходит.

В Unity приложении я к примеру ввожу пароль "1234qwerty", при помощи связи unity с php-скриптом он кодируется в вид MD5 и отправляется в базу для сравнение его в ячейке, в ячейке БД пароль лежит примерно в таком виде: "$P$BBoBeLvbVYRyFLR5OcuqvPrmKEIKU2/".

В итоге решил проверить в каком виде пароль доходит до базы для сравнения, и он доходит в таком виде "06a8647723d4d285aefdb02ed285220b" который естественно не совпадает с паролем который лежит в ячейке БД:"$P$BBoBeLvbVYRyFLR5OcuqvPrmKEIKU2/".

И как добиться такой кодировки пароля что бы они совпадали без понятия так как в php мало опыта, без совпадения не могу сделать нормальную авторизацию с вводом логина и пароля.

Связь с БД сайта делаю при помощи php скрипта:

<?
$command=$_POST['command'];
$databasehost="*******";
$databaseuser="*******";
$databasepassword="*******";
$databasename="*******";
$db = mysql_connect($databasehost,$databaseuser,$databasepassword)or die("cannot connect"); 
mysql_select_db($databasename,$db)or die("cannot select DB");
mysql_query('SET CHARACTER SET utf8');
mysql_query('SET NAMES utf8');
switch($command)
{
case "logined":
$login=$_POST['login']; //from Unity strings
$pass=$_POST['pass'];   //from Unity strings
//$pass = sha1($pass);
$pass = md5($pass); //кодировка в md5
$res = mysql_query("SELECT * FROM wp_users WHERE user_login='$login'"); //AND user_pass='$pass'");  
$res_myrow = mysql_fetch_array($res);
$dbPass = $res_myrow['user_pass'];                                                                  
$id = $res_myrow['ID'];   //! empty                                                                         
$name = $res_myrow['user_nicename'];                                                                
if(password_verify($pass, $dbPass))
{
echo "done ";
}else{
echo "Error password_verify ";
} 
echo "us->$login : pas->$pass : id->$id : name->$name";
break;
}
?>

В Unity вот такой скрипт для отправки полей: login и pass

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class MysqlConnect : MonoBehaviour {
private string username = ""; //Переменная для хранения имени
private string pswd = ""; //Переменная для хранения пароля
public string url = "*******"; //Переменная для хранения адреса
//Создание метода, отвечающего за подключение и передачу данных
public void Connect(){
    WWWForm form = new WWWForm();
    form.AddField("command", "logined");
    form.AddField("login", username);
    form.AddField("pass", pswd);
    WWW www = new WWW(url, form);
    StartCoroutine(WaitReqwest(www));
}
private IEnumerator WaitReqwest(WWW www){
    yield return www;
    if (www.text.Length > 0)
    {
        Debug.Log("Ответ " + www.text);
    }
}
//Создаём метод OnGUI()
void OnGUI()
{
    //Создаём текстовое поле для ввода имени пользователя
    username = GUI.TextField(new Rect(Screen.width/2-100, Screen.height/2-100, 200, 20), username, 20);
    //Создаём текстовое поле для ввода пароля
    pswd = GUI.TextField(new Rect(Screen.width/2-100, Screen.height/2-75, 200, 20), pswd, 12);
    //Создаём кнопку для произведения подключения
    if (GUI.Button(new Rect(Screen.width/2-100, Screen.height/2-25, 200, 20), "Connect"))
    {
        Connect();
    }
  }
}
Answer 1

WordPress давно ушел от использования md5 в паролях. Уже несколько лет применяется Portable PHP password hashing framework.

Хеш при этом создается динамический. К примеру, два раза устанавливаем один и тот же пароль 1234qwerty одному и тому же пользователю. В базе результаты разные:

$P$BO3FF.P7juE2PL.YLD6ggOV9Fk1hnz/
$P$BAkIMkL/cnvMgjh84BeQovZKzrFGg7.

Резюме: не надо изобретать велосипед. В WordPress все уже давно предусмотрено. Ваша задача решается одной строчкой кода в WordPress:

$result = wp_authenticate( 'ttt', '1234qwerty' );

Функция возвращает объект данных о пользователе WP_User в случае успеха и объект WP_Error в случае ошибки.

Естественно, такой вызов не может быть сделан из некого файла, лежащего в папке WordPress. Надо провести инициализацию CMS. Добавьте в functions.php примерно такой код:

add_action( 'init', 'check_auth' );
function check_auth() {
    $command=$_POST['command'];
    switch($command) {
        case "logined":
            $login=$_POST['login']; //from Unity strings
            $pass=$_POST['pass'];   //from Unity strings
            $result = wp_authenticate( $login, $pass );
            if ( is_wp_error( $result ) ) {
                wp_send_json_error();
            } else {
                wp_send_json_success();
            }
    }
}
READ ALSO
Access denied for user &#39;&#39;@&#39;localhost&#39; при использовании пустого пароля

Access denied for user ''@'localhost' при использовании пустого пароля

Имеем стандартную форму подключения:

279
Ошибка при попытке вывести endl: no match for ‘operator&lt;&lt;’ (operand types are ‘A’ and ‘&lt;unresolved overloaded function type&gt;’)

Ошибка при попытке вывести endl: no match for ‘operator<<’ (operand types are ‘A’ and ‘<unresolved overloaded function type>’)

Хочу написать класс обертку, который в зависимости от переменных будет или не будет выводить лог в stdout и/или файл logtxt

339