Laravel Custom Guard для внешнего пользователя API - нет базы данных или зарегистрированный внутренний пользователь - PullRequest
0 голосов
/ 19 сентября 2019

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

Кроме того, делегируя, я не хочу перемещать сеанс данных, включающий элемент управления, когда пользователь входил в систему.Как я могу назначить токены после входа пользователя в большинство сделок?

Относительно экрана входа в систему для этих элементов управления через почтовую систему

Файл контроллера

public function loginData(Request $request)
    {

        $password = $request->password;
        $email = $request->email;
        $apiman = "Bearer {$this->accesstokenApi()}";
        $client = new Client();
        $response = $client->post('https://testapi.com/api/v3/Profile', [
            'headers' => 
            [
                'cache-control' => 'no-cache', 
                'authorization' => $apiman, 
                'content-type'  => 'application/json'
            ],
            'json' => 
            [
                'Email' => $email,
                'Password' => $password
            ],

        ]);
        $data = json_decode((string) $response->getBody(), true);


        if ($data['ResponseType']=="Ok") {
            session()->put('token', $data);
            return redirect('/user-detail');
        } else {
            return response()->json([
                'success' => false,
                'message' => 'Invalid Email or Password',
            ], 401);
        }
    }

Здесь я создалГруппа промежуточного программного обеспечения под названием XXXAPI

Route::prefix('{lang?}')->middleware('locale', 'XXXAPI')->group(function($lang=null) {
    Route::redirect('/', '/login');
    Route::post('login', 'ApiController@loginData')->name('api.login');
    Route::get('login', 'ApiController@loginForm')->name('show.login');
    Route::get('/user', 'ApiController@kontrolData');
    Route::post('password', 'ApiController@passwordDegistir')->name('password.request');
    Route::get('home', 'ApiController@getAuthUser')->name('user.home');
    Route::get('brands', 'BrandsController@index');
    Route::get('hotels', 'HotelController@index');
    Route::get('hotel-detail', 'HotelController@hotelDetail');

});

В следующем коде я создал промежуточное программное обеспечение с именем XxxApi.Если есть токен, я сказал, что нужно идти вперед или поместить токен в сессию.


class XxxApi
{
    public function handle($request, Closure $next)
    {
        if(session()->has('token')) {
            return $next($request);    
        } else {
            $request->session()->put('token', time());
            return $next($request);  

        }
    }
}

А потом я добавил Kernel.php File этот код строки в защищенном $ routeMiddleware


 'XXXAPI' => \App\Http\Middleware\XxxApi::class,

Guardфайл следующим образом.Я адаптировал его из кода, который я где-то нашел.Настоящая проблема здесь заключается в том, что мне нужно дать значение signInWithXxx


<?php

declare(strict_types=1);

namespace App\Auth\Guards;

use Closure;
use App\User;
use Illuminate\Auth\AuthenticationException;
use Illuminate\Contracts\Auth\Authenticatable;
use Illuminate\Contracts\Auth\Guard;
use Illuminate\Http\Request;

/**
 * Class PinGuard
 */
class XxxGuard implements Guard
{
    /**
     * @var null|Authenticatable|User
     */
    protected $user;

    /**
     * @var Request
     */
    protected $request;

    /**
     * OpenAPIGuard constructor.
     *
     * @param Request $request
     */
    public function __construct(Request $request)
    {
        $this->request = $request;
    }

    /**
     * Check whether user is logged in.
     *
     * @return bool
     */
    public function check(): bool
    {
        return (bool)$this->user();
    }

    /**
     * Check whether user is not logged in.
     *
     * @return bool
     */
    public function guest(): bool
    {
        return !$this->check();
    }

    /**
     * Return user id or null.
     *
     * @return null|int
     */
    public function id(): ?int
    {
        $user = $this->user();
        return $user->id ?? null;
    }

    /**
     * Manually set user as logged in.
     * 
     * @param  null|\App\User|\Illuminate\Contracts\Auth\Authenticatable $user
     * @return $this
     */
    public function setUser(?Authenticatable $user): self
    {
        $this->user = $user;
        return $this;
    }

    /**
     * @param  array $credentials
     * @return bool
     */
    public function validate(array $credentials = []): bool
    {
        throw new \BadMethodCallException('Unexpected method call');
    }

    /**
     * Return user or throw AuthenticationException.
     *
     * @throws AuthenticationException
     * @return \App\User
     */
    public function authenticate(): User
    {
        $user = $this->user();
        if ($user instanceof User) {
            return $user;
        }
        throw new AuthenticationException();
    }

    /**
     * Return cached user or newly authenticate user.
     *
     * @return null|\App\User|\Illuminate\Contracts\Auth\Authenticatable
     */
    public function user(): ?User
    {
        return $this->user ?: $this->signInWithXxx();
    }

    /**
     * Sign in using requested PIN.
     *
     * @return null|User
     */
    protected function signInWithXxx(): ?User
    {

         // Implement your logic here
        // Return User on success, or return null on failure
    }

    /**
     * Logout user.
     */
    public function logout(): void
    {
        if ($this->user) {
            $this->setUser(null);
        }
    }
}

config / auth.php

'guards' => [
        'web' => [
            'driver' => 'XXXAPI',
        ],
        // 'api' => [
        //     'driver' => 'session',
        //     'provider' => 'users',
        // ],
        // 'web' => [
        //     'driver' => 'session',
        //     'provider' => 'users',
        // ],
    ],

AuthServiceProvider


<?php

declare(strict_types=1);

namespace App\Providers;

use App\Auth\Guards\XxxGuard;
use Illuminate\Container\Container;
use Illuminate\Foundation\Support\Providers\AuthServiceProvider as ServiceProvider;
use Illuminate\Support\Facades\Auth;

class AuthServiceProvider extends ServiceProvider
{
   /**
    * The policy mappings for the application.
    *
    * @var array
    */
   protected $policies = [];

   /**
    * Register any authentication / authorization services.
    */
   public function boot()
   {
       Auth::extend('XXXAPI', function (Container $app) {
           return new XxxGuard($app['request']);
       });
       $this->registerPolicies();
   }
}

Trait NoRememberTokenAuthenticatable


<?php

declare(strict_types=1);

namespace App\Auth;

use Illuminate\Database\Eloquent\Model;

/**
 * Trait NoRememberTokenAuthenticatable
 *
 * @mixin Model
 */
trait NoRememberTokenAuthenticatable
{
    /**
     * Get the name of the unique identifier for the user.
     *
     * @return string
     */
    public function getAuthIdentifierName()
    {
        return 'id';
    }

    /**
     * Get the unique identifier for the user.
     *
     * @return mixed
     */
    public function getAuthIdentifier()
    {
        return $this->id;
    }

    /**
     * Get the password for the user.
     *
     * @return string
     * @codeCoverageIgnore
     */
    public function getAuthPassword()
    {
        throw new \BadMethodCallException('Unexpected method call');
    }

    /**
     * Get the token value for the "remember me" session.
     *
     * @return string
     * @codeCoverageIgnore
     */
    public function getRememberToken()
    {
        throw new \BadMethodCallException('Unexpected method call');
    }

    /**
     * Set the token value for the "remember me" session.
     *
     * @param string $value
     * @codeCoverageIgnore
     */
    public function setRememberToken($value)
    {
        throw new \BadMethodCallException('Unexpected method call');
    }

    /**
     * Get the column name for the "remember me" token.
     *
     * @return string
     * @codeCoverageIgnore
     */
    public function getRememberTokenName()
    {
        throw new \BadMethodCallException('Unexpected method call');
    }
}

Реальная проблема здесь в том, что мне нужно указать значение класса signInWithXxx.Я не знаю, как я могу продолжить?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...