15

Estoy realizando una login por api_token usando laravel 5.4

La ruta esta definida como

Route::get('/test', 'Auth\authenticatedApiLogin@authenticatedApiLogin')->middleware('auth:api');

Y si hago dentro del método:

dd(Auth::guard('api')->user())

me muestra bien el usuario, sin embargo al querer autenticar una instancia de este usuario para el guard web realizando lo siguiente no funciona:

  public function authenticatedApiLogin() {

         Auth::guard('web')->login(Auth::guard('api')->user());


        return redirect()->route('venta.homes.index');

    }

Al hacer lo anterior, cierra sesiòn y me manda a la pantalla de login.

Si imprimo dd(Auth::guard('web')) me muestra:

SessionGuard {#674 ▼
  #name: "web"
  #lastAttempted: null
  #viaRemember: false
  #session: Store {#666 ▶}
  #cookie: CookieJar {#679 ▶}
  #request: Request {#40 ▶}
  #events: Dispatcher {#5 ▶}
  #loggedOut: false
  #tokenRetrievalAttempted: false
  #user: UsersModel {#681 ▶}
  #provider: EloquentUserProvider {#673 ▶}
}

La ruta que yo quiero ingresar tiene el middleware Auth, la primera vez que entra detecha el Guard Api, la segunda, luego de hacer Auth::guard('web')->login(Auth::guard('api')->user()) ya no me detecta el guard.

Viendo el log del siguiente método (class Authenticate) se ve lo siguiente:

public function handle($request, Closure $next, ...$guards) {

    Log::info($guards);

    $this->authenticate($guards);

    return $next($request);
}

[2017-04-27 12:37:07] local.INFO: array ( 0 => 'api', )
[2017-04-27 12:37:07] local.INFO: array ( )

El archivo Auth.php tiene lo siguiente:

<?php

return [

    /*
    |--------------------------------------------------------------------------
    | Authentication Defaults
    |--------------------------------------------------------------------------
    |
    | This option controls the default authentication "guard" and password
    | reset options for your application. You may change these defaults
    | as required, but they're a perfect start for most applications.
    |
    */

    'defaults' => [
        'guard' => 'web',
        'passwords' => 'users',
    ],

    /*
    |--------------------------------------------------------------------------
    | Authentication Guards
    |--------------------------------------------------------------------------
    |
    | Next, you may define every authentication guard for your application.
    | Of course, a great default configuration has been defined for you
    | here which uses session storage and the Eloquent user provider.
    |
    | All authentication drivers have a user provider. This defines how the
    | users are actually retrieved out of your database or other storage
    | mechanisms used by this application to persist your user's data.
    |
    | Supported: "session", "token"
    |
    */

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

        'api' => [
            'driver' => 'token',
            'provider' => 'users',
        ],
    ],

    /*
    |--------------------------------------------------------------------------
    | User Providers
    |--------------------------------------------------------------------------
    |
    | All authentication drivers have a user provider. This defines how the
    | users are actually retrieved out of your database or other storage
    | mechanisms used by this application to persist your user's data.
    |
    | If you have multiple user tables or models you may configure multiple
    | sources which represent each model / table. These sources may then
    | be assigned to any extra authentication guards you have defined.
    |
    | Supported: "database", "eloquent"
    |
    */

    'providers' => [
        'users' => [
            'driver' => 'eloquent',
            'model' => MolInterno\Users\UsersModel::class,
        ],

        // 'users' => [
        //     'driver' => 'database',
        //     'table' => 'users',
        // ],
    ],

    /*
    |--------------------------------------------------------------------------
    | Resetting Passwords
    |--------------------------------------------------------------------------
    |
    | You may specify multiple password reset configurations if you have more
    | than one user table or model in the application and you want to have
    | separate password reset settings based on the specific user types.
    |
    | The expire time is the number of minutes that the reset token should be
    | considered valid. This security feature keeps tokens short-lived so
    | they have less time to be guessed. You may change this as needed.
    |
    */

    'passwords' => [
        'users' => [
            'provider' => 'users',
            'table' => 'password_resets',
            'expire' => 60,
        ],
    ],

];
8
  • ¿qué es lo que muestra el primer dd()?
    – Shaz
    Commented el 27 abr. 2017 a las 15:39
  • ahi justo edite, a que dd() te referis? que parte? @Shaz Commented el 27 abr. 2017 a las 15:41
  • Me refiero a esta parte: Y si hago dentro del método: dd(Auth::guard('api')->user())
    – Shaz
    Commented el 27 abr. 2017 a las 15:42
  • UsersModel {#682 ▼ #table: "users" #fillable: array:4 [▶] #hidden: array:2 [▶] #dates: array:1 [▶] #connection: null #primaryKey: "id" #keyType: "int" #perPage: 15 +incrementing: true +timestamps: true #attributes: array:10 [▶] #original: array:10 [▶] #relations: [] #visible: [] #appends: [] #guarded: array:1 [▶] #dateFormat: null #casts: [] #touches: [] #observables: [] #with: [] +exists: true +wasRecentlyCreated: false #rememberTokenName: "remember_token" #forceDeleting: false } @Shaz Commented el 27 abr. 2017 a las 15:43
  • 2
    Es raro porque si hago dd(Auth::guard('web')->user()) tambien me muestar el usuario. No estoy entiendo esto!! @Shaz Commented el 27 abr. 2017 a las 15:47

2 respuestas 2

0

Este tutorial es muy especifico al respecto,

https://blog.flicher.net/laravel-rest-api-passport-authentication-for-ionic-app/

Algunos aspectos importantes, una vez autenticado el user, debe retornar el token de acceso, e inmediatamente guardarlo en la localstorage, generalmente lo guardo ahi, para que luego cuando recargues la pagina y hagas un llamado ajax envies el token de acceso y se pueda autenticar correctamente y obtener los datos del usuario;

0

Segun veo el problema esta en :

 public function authenticatedApiLogin() {

     Auth::guard('web')->login(Auth::guard('api')->user());


    return redirect()->route('venta.homes.index');

}

prueba esto:

if(Auth::guard('api')->attempt(['username' => request('username'), 'password' => request('password')])){
        $user = Auth::guard('api')->user();
}

y como bien te dice el compañero tienes que crear un token mediante Passport https://laravel.com/docs/5.8/passport , para poder hacer el logout despues y poder determinar a que Routes acceden lo users que esten logueados:

if(! $user == null){
   $success['token'] =  $user->createToken('app')->accessToken;
   return response()->json(['succes' => $success, 'user' => $user]);
}else{
   return response()->json(['error' =>'Usuario no encontrado.'],401);
 }

Y en tu model User tienes que poner:

 use Laravel\Passport\HasApiTokens;
 class UserApp extends Authenticatable 
 {
    use HasApiTokens;

    protected $guard = 'api';
 }

Y en tu Auth.php:

  'api' => [
        'driver' => 'passport',
        'provider' => 'users',
    ],

Me costo mucho crear un nuevo guard para mi aplicacion en Laravel, pero con esto me funciono.

¿No es la respuesta que buscas? Examina otras preguntas con la etiqueta o formula tu propia pregunta.