Я пытался включить внешнюю аутентификацию с аутентификацией Laravel, и мне кажется, что она не работает
Прочитал и попробовал эту статью, которую я нашел здесь, в stackoverflow, Пользовательская аутентификация пользователя на основеВ ответ на вызов API , основанный на этой статье, я успешно поместил информацию о пользователях, прошедших внешнюю аутентификацию, в систему аутентификации Laravel.
Моя проблема заключается в том, когда я выполняю вход и использую эти учетные данные для входа в систему.внешний API (при условии, что мы успешно извлекаем информацию о пользователе из API) и перенаправляем на другую страницу, Auth::user()
, похоже, не работает и всегда возвращает значение null
, похоже, сеанс не сохраняется ...
Я также пытался создать пользовательский сеанс, чтобы поместить возвращаемые данные из API в ApiUserProvider для последующего доступа к ним по другим маршрутам, но сеанс пропадает ....
Я надеюсь, что некоторые из них могут помочьмне, спасибо
PS: я использую Laravel 5.4
config / auth.php
'providers' => [
'users' => [
'driver' => 'api',
],
],
app / Providers / AuthServiceProvider
namespace App\Providers;
use Illuminate\Support\Facades\Auth;
use Illuminate\Foundation\Support\Providers\AuthServiceProvider as ServiceProvider;
class AuthServiceProvider extends ServiceProvider
{
protected $policies = [
'App\Model' => 'App\Policies\ModelPolicy',
];
public function boot()
{
$this->registerPolicies();
Auth::provider('api', function ($app, array $config) {
return new \App\Providers\ApiUserProvider($this->app['hash']);
});
}
}
app / Providers / ApiUserProvider.php
namespace App\Providers;
use Illuminate\Support\Facades\Auth;
use Illuminate\Contracts\Auth\UserProvider;
use Illuminate\Contracts\Hashing\Hasher as HasherContract;
use Illuminate\Contracts\Auth\Authenticatable as UserContract;
class ApiUserProvider implements UserProvider
{
protected $hasher;
public function __construct(HasherContract $hasher)
{
$this->hasher = $hasher;
}
public function retrieveByCredentials(array $credentials)
{
$user = [];
$post = [
'username' => $credentials['username'],
'password' => $credentials['password']
];
$ch = curl_init();
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_URL, 'https://sample.com/dev/admin/login');
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($post));
curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-Type:application/json'));
$response = curl_exec($ch);
$response = json_decode($response, true);
curl_close($ch);
if(isset($response['successful']) && $response['successful']) {
$response['claims'] = json_decode(base64_decode(explode('.', $response['token'])[1]));
$response['password'] = bcrypt($credentials['password']);
$response['username'] = $credentials['username'];
$response['id'] = $response['claims']->client_id;
$response['remember_token'] = null;
$user = $response;
session()->put($response['claims']->client_id, $response); //<--- I attempt to put it in session
}
$user = $user ? : null;
return $this->getApiUser($user);
}
public function retrieveById($identifier)
{
//$user = $this->getUserById($identifier);
$user = session()->get($identifier); //<---- attempted to retrieve the user, but session don't exists if I go in other route
return $this->getApiUser($user);
}
public function validateCredentials(UserContract $user, array $credentials)
{
return $this->hasher->check(
$credentials['password'], $user->getAuthPassword()
);
}
protected function getApiUser($user)
{
if ($user !== null) {
return new \App\ApiUser((array) $user);
}
}
protected function getUserById($id)
{
$user = session()->get($id);
return $user ?: null;
}
public function retrieveByToken($identifier, $token) { }
public function updateRememberToken(UserContract $user, $token) { }
}
UserController.php
namespace App\Http\Controllers;
use Illuminate\Support\Facades\Auth;
use Illuminate\Http\Request;
use Illuminate\Contracts\Auth\SessionGuard;
class UserController extends Controller
{
protected function attemptLogin(Request $request)
{
return $this->guard()->attempt($this->credentials($request));
}
protected function guard()
{
return Auth::guard();
}
protected function credentials(Request $request)
{
return $request->only('username', 'password');
}
public function login(Request $request)
{
if ($this->attemptLogin($request)) {
dd(auth());
return "T";
}
return "F";
}
public function getCurrentUserInfo(Request $request)
{
dd(auth()); //<------------- user info no longer exist here
}
}