Laravel身份验证自定义用户名和密码加密

时间:2018-11-13 23:02:49

标签: php laravel authentication bcrypt

我想学习Laravel,并希望将Discord机器人链接到监控网站。
用户可以使用Discord上的命令设置密码,该密码使用Bcrypt(带有bcrypt npm软件包)进行加密。
我的目标是提供一个网页,用户可以在其中输入他的客户ID和先前设置的密码来登录,然后可以访问一些基本功能来管理主持人所在的服务器。

我有以下登录页面:

<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

另外,这是我的User类:

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'
    ];
}

我的 users 表具有三列:

  • id(这是Discord上的客户端ID)
  • xp(整数)
  • 密码(Blob类型的密码,用于存储bcrypt加密密码)

因为我使用的是默认身份验证系统,所以我只是在 app / Http / Controllers / Auth / LoginController.php 中写了 username 函数:

public function username()
{
    return "id";
}

该系统无法正常工作,我不知道为什么,因为我刚刚开始学习Laravel。我当时在考虑加密问题,但Laravel似乎也在使用Bcrypt。

编辑
我没有php错误,但是当我尝试登录时,被告知我的凭据错误。
我将密码类型从Blob更改为Varchar,并将用户名功能更改为如下变量:

protected $username = "id"

编辑2 我的laravel版本是5.7.13。
我尝试在用户模型中添加表名,但仍然无法使用。
关于我创建用户的方式,不是使用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
    }
}

我仍然无法连接。

0 个答案:

没有答案