Laravel аутентификация пользовательского имени пользователя и шифрование пароля - PullRequest
0 голосов
/ 14 ноября 2018

Я хотел изучить 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
    }
}

Я все еще не могу подключиться.

...