Я хотел изучить Laravel, и для этого я хотел связать своего бота Discord с веб-сайтом мониторинга.
Пользователь может установить пароль с помощью команды Discord, которая зашифрована с помощью Bcrypt (с пакетом bcrypt npm).
Моя цель - предоставить веб-страницу, на которой пользователь может ввести свой идентификатор клиента и ранее установленный пароль для входа в систему, а затем получить доступ к некоторым основным функциям для управления серверами, на которых он модератор.
У меня есть следующая страница входа:
<div class="panel">
<h1 class="title">Get connected !</h1>
<h2 class="detail">Login and manage your servers !</h2>
<form method="POST" action="{{ route('login') }}">
@csrf
<label for="id" class="label">Client id :</label>
<input type="text" placeholder="Client id" name="id" value="{{ old('id') }}" autofocus>
<label for="password" class="label">Password :</label>
<input type="password" placeholder="Password" name="password">
<input type="submit" value="{{ __('Login') }}">
</form>
</div>
@if (count($errors) > 0)
<div class="form-error">
<span class="label">Your email and/or password isn't correct.</span>
</div>
@endif
Также, вот мой класс пользователя:
class User extends Authenticatable
{
use Notifiable;
/**
* The attributes that are mass assignable.
*
* @var array
*/
protected $fillable = [
'id', 'password',
];
/**
* The attributes that should be hidden for arrays.
*
* @var array
*/
protected $hidden = [
'password'
];
}
Мои пользователи таблица состоит из трех столбцов:
- id (который является идентификатором клиента на Discord)
- xp (целое число)
- пароль (типа Blob, для хранения зашифрованного пароля bcrypt)
Поскольку я использую систему аутентификации по умолчанию, я просто написал функцию username в app / Http / Controllers / Auth / LoginController.php :
public function username()
{
return "id";
}
Эта система не работает, и я не знаю почему, потому что я только начал изучать Laravel. Я думал о проблеме шифрования, но Laravel, похоже, тоже использует Bcrypt.
EDIT
У меня нет ошибок php, но когда я пытаюсь войти в систему, мне говорят, что мои учетные данные неверны.
Я изменил тип пароля с Blob на Varchar и функцию username на переменную вроде:
protected $username = "id"
РЕДАКТИРОВАТЬ 2
Моя версия Laravel - 5.7.13.
Я попытался добавить имя таблицы в моей модели User, но она все еще не работает.
Что касается того, как я создаю своих пользователей, то это делается не с помощью php, а с использованием Javascript, поскольку у вас должна быть возможность зарегистрироваться, только если вы находитесь на сервере Discord, на котором есть мой бот.
Когда пользователь запускает команду register , в моей базе данных вызывается следующая функция:
CREATE DEFINER=`root`@`localhost` FUNCTION `addUser`(user_id VARCHAR(18), server_id VARCHAR(18)) RETURNS tinyint(1) DETERMINISTIC
BEGIN
IF((SELECT COUNT(id) FROM (SELECT * FROM servers WHERE id=server_id) AS a) = 0) THEN
INSERT INTO servers VALUES (server_id);
INSERT INTO aremembersof VALUES ("notregistered", 3, server_id);
END IF;
IF((SELECT COUNT(id) FROM (SELECT * FROM users WHERE id=user_id) AS a) = 0) THEN
INSERT INTO users VALUES (user_id);
END IF;
IF ((SELECT COUNT(id) FROM (SELECT * FROM aremembersof WHERE id_servers=server_id AND id=user_id) AS a) = 0) THEN
INSERT INTO aremembersof VALUES (user_id, 2, server_id);
ELSE
RETURN false;
END IF;
RETURN true;
END
При первой регистрации пользователя пароль не устанавливается. Это может показаться странным, но пароль используется только для входа на веб-сайт управления. Чтобы определить пароль, пользователь должен вызвать команду setPassword , код которой:
if(args.length > 0){
bcrypt.hash(args[0], 0, async (err, hash) => {
await dbUtilities.execute("UPDATE users SET password = \"" + hash + "\" WHERE id = \"" + message.author.id + "\"");
message.reply({embed: {
color: parseInt(colors.success, 16),
description: "Your password has been changed!"
}});
});
return;
}
message.reply({embed: {
color: parseInt(colors.danger, 16),
description: "You have to specify a password!"
}});
На самом деле некоторые другие проверки выполняются для того, чтобы убедиться, что пользователь не устанавливает свой новый пароль из общедоступного канала, но здесь он не имеет значения.
Также args [0] соответствует паролю, введенному пользователем.
РЕДАКТИРОВАТЬ 3
Как и предполагалось, я изменил свою систему так, что пароль должен быть установлен на веб-сайте напрямую. Таким образом, команда setPassword устанавливает токен, который используется на веб-сайте на странице активации.
Вот функция, вызываемая при отправке формы:
public function activatePost(Request $request)
{
\Debugbar::info($request);
$this->validate($request, [
'token' => 'required',
'password' => 'required|confirmed'
]);
$password_reset = PasswordReset::where('token', $request->token)->first();
if($password_reset != null)
{
$user = User::where('id', $password_reset->id)->first();
$user->password = \Hash::make($request->password);
$user->save();
return redirect()->route('login')->with('message', 'Your password has been set!');
}
else {
// TODO
}
}
Я все еще не могу подключиться.