Делаю авторизацию в приложении 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();
}
}
}
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();
}
}
}
Кофе для программистов: как напиток влияет на продуктивность кодеров?
Рекламные вывески: как привлечь внимание и увеличить продажи
Стратегії та тренди в SMM - Технології, що формують майбутнє сьогодні
Выделенный сервер, что это, для чего нужен и какие характеристики важны?
Современные решения для бизнеса: как облачные и виртуальные технологии меняют рынок
Имеем стандартную форму подключения:
Хочу написать класс обертку, который в зависимости от переменных будет или не будет выводить лог в stdout и/или файл logtxt