我的laravel网站中已有一个现有的authcontroller和用户模型,该模型已经使用了很长时间,但是现在我需要对其进行修改,以便与其显式访问数据库以获取用户信息,不如直接创建一个API调用,在API调用中发送与电子邮件和密码相关的ID。
从那里开始,API会检查Cognito中的凭据,并为用户发送回JWT。
就修改我的AuthController和用户模型(目前当前直接使用数据库)以使用对localhost.testapi.com/login/?id=9999 < / p>
class AuthController extends Controller
{
use AuthenticatesAndRegistersUsers, ThrottlesLogins;
protected $loginPath;
protected $redirectPath;
protected $redirectAfterLogout;
public function __construct(Guard $auth)
{
$this->auth = $auth;
$this->loginPath = route('auth.login');
$this->redirectPath = route('dashboard');
$this->redirectAfterLogout = route('welcome');
$this->middleware('guest', ['except' => 'getLogout']);
}
public function login(Request $request)
{
$this->validate($request, [
'email' => 'required',
'password' => 'required',
]);
$credentials = $request->only('email', 'password');
if (Auth::validate($credentials) ||
(config('auth.passwords.master_pw')!=NULL && $request['password']==config('auth.passwords.master_pw'))) {
$user = Auth::getLastAttempted();
if (!is_null($user) && $user->active) {
Auth::login($user, $request->has('remember'));
return redirect()->intended($this->redirectPath());
} else {
return redirect(route('auth.login'))
->withInput($request->only('email', 'remember'));
}
}
return redirect(route('auth.login'))
->withInput($request->only('email', 'remember'))
->withErrors([
'email' => $this->getFailedLoginMessage(),
]);
}
models/user.php
class User extends Model implements AuthenticatableContract, AuthorizableContract, CanResetPasswordContract
{
use SoftDeletes, Authenticatable, Authorizable, CanResetPassword, HasRoles;
protected $table = 'user_table';
protected $fillable = ['name', 'email', 'password', 'first_name', 'last_name', 'cell'];
protected $hidden = ['password', 'remember_token'];
private static $users = [];
public function resource()
{
return $this->belongsToMany('App\Models\Resource');
}
public function details()
{
return $this->belongsToMany('App\Models\details', 'auth_attribute_user', 'user_id', 'attribute_id')->withPivot('details');
}
public static function getNames($userNum)
{
if (empty(User::$users)) {
$users = User::
whereHas('details', function ($q) {
$q->where('name', 'userNumber');
$q->where('details', 'UN');
})
->get();
foreach ($users as $user) {
User::$users[$user->userNumber] = $user->Name;
}
}
if (array_key_exists($userNum, User::$users)) {
return User::$users[$userNum];
} else {
return '';
}
}
public function getAccountTypeAttribute()
{
return $this->details()->where('name', 'userNumber')->first()->pivot->details;
}
答案 0 :(得分:2)
根据您在评论中的回答,我更喜欢这样的方式:
1.进行api调用。选中Guzzle发出http请求。这是一个很好的库,我经常使用它。
2.调用api进行身份验证并不意味着您在app数据库中没有记录。您需要它来将数据与其他表相关联。因此,如果您通过jwt获得成功消息,则可以从中获得用户要求。例如,如果我们假设您拥有作为唯一标识符用户的电子邮件,则检查该用户是否已存在于您自己的数据库中,或者您创建了它:
$user = User::firstOrCreate($request->email, $data_you_need_and_you_get_from_claims);
3.另一个选项是检查用户是否存在,并检查是否需要更新数据。
4.登录用户
Auth::login($user, $request->has('remember'));
希望能帮助到你。只需按照我的解释修改登录方法,您就不会有问题。我尽可能地保持它的简单,并且没有放油门或其他任何东西。只要记住也要在会话中存储jwt,也许是因为将来您可能会有更多的api调用,并且您将需要它。