использование частного API для authController и пользовательской модели

У меня есть существующий authcontroller и пользовательская модель на моем сайте laravel, которая работала в течение длительного времени, но теперь мне нужно изменить ее так, чтобы вместо явного обращения к базе данных для пользовательской информации она вместо этого выполняла вызов API, отправка идентификатора в вызове API, который относится к электронной почте и паролю.

Оттуда API проверяет учетные данные в Cognito и отправляет обратно JWT для пользователя.

Я немного озадачен тем, с чего начать, чтобы изменить мой AuthController и модель пользователя, которая в настоящее время использует базу данных напрямую, вместо того, чтобы вместо этого использовать вызов API для localhost.testapi.com/login/?id=9999.

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

Решение

Согласно вашим ответам в ваших комментариях, я предпочитаю так:
1. Сделайте вызов API. Проверьте Guzzle, чтобы сделать http-запросы. Это хорошая библиотека, и я часто использую ее;
2. Вызов API для аутентификации не означает, что у вас нет записи в базе данных приложения. Это нужно для связи ваших данных с другими таблицами. Так что, если вы получите сообщение об успехе с jwt, вы можете получить от него заявки пользователей. Например, если мы предполагаем, что у вас в качестве уникального идентификатора есть электронная почта пользователя, вы проверяете, существует ли пользователь в вашей собственной БД или вы создаете его:

$user = User::firstOrCreate($request->email, $data_you_need_and_you_get_from_claims);

3. Другой вариант — проверить, существует ли пользователь, и проверить, нужно ли обновлять данные.
4. Логин пользователя

Auth::login($user, $request->has('remember'));

Надеюсь, поможет. Просто измените метод входа, как я объяснил вам, и у вас не будет проблем. Я держал это настолько просто, насколько мог, и не ставил газ или что-то еще. Просто не забывайте хранить jwt в сессии, возможно, потому что в будущем у вас может быть больше вызовов API, и вам это понадобится.

2

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector