我想学习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 表具有三列:
因为我使用的是默认身份验证系统,所以我只是在 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
}
}
我仍然无法连接。