首页 > 解决方案 > 两个 Laravel 项目之间的 Laravel Passport

问题描述

我有一个很大的斗争。

我正在尝试创建两个 Laravel 网站。一个用于前端,一个用于后端。后端将 API 生成的信息提供给前端。对我来说唯一困难的一件事是为前端创建 Auth 和 Guard。网上有很多关于如何在一个 Laravel 项目上制作系统的教程,但不是在两个项目上,也不是在不同的主机上。

我通过此文档设置了后端:https ://laravel.com/docs/5.5/passport 我对其进行了测试,一切看起来都很好。

问题在于与前端的配合。我想摆脱数据库身份验证并使用护照的令牌:/

有没有人有一些项目或教程,我可以看看?谢谢!

标签: phplaravelapiaccess-tokenlaravel-passport

解决方案


在前端创建users(id, created_at, updated_at)表格和模型User

use Illuminate\Foundation\Auth\User as Authenticatable;
use App\Models\Helpers\ModelHelper;
use Auth;

class User extends Authenticatable
{        
    //here $userData we will get from backend server

    public static function createAuth($userData){
        $user = new User();
        $user->name = $userData['name'];
        //all other fields

        Auth::login($user);

        return $user;
    }
}

在此之后在前端创建一个登录操作,并在后端服务器创建一个登录,然后在后端服务器创建个人访问令牌并将其作为 json 响应返回

后端的登录操作

public function login(Request $request)
{
    $credentials = $request->only('email', 'password');

    if(Auth::attempt($credentials)){ 
        $user = Auth::user(); 
        $success['token'] =  $user->createToken('MyApp')-> accessToken; 
        $success['user'] = $user;
        return response()->json(['success' => $success], $this-> successStatus); 
    } 
    else{ 
        return response()->json(['error'=>'Unauthorised'], 401); 
    } 
}

前端登录操作

public function login(Request $request)
{
      $http = new GuzzleHttp\Client; 

      $response = $http->post('http://backend.local/api/login', [
            'headers' => [
                'Accept' => 'application/json',
            ],
            'form_params' => [
                'email' => 'username@example.vom', 
                'password' => '123', 
            ]
        ]);

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

        $request->session()->put('authUser', $info['success']['user']); 

        \App\User::createAuth($info['success']['user']);

        return redirect('/');
}

创建自定义中间件RemoteAuth

namespace App\Http\Middleware;

use Illuminate\Auth\AuthenticationException;
use Closure;
use Auth;
use App\User;

class RemoteAuth
{
    public function handle($request, Closure $next)
    {
        if (!empty(session('authUser'))) {
            $user = $request->session()->get('authUser');

            User::createAuth($user);

            return $next($request);
        }

        return redirect('/login');
    }
}

Kernel.phpprotected $routeMiddlewaresection中注册此中间件。

'remoteAuth' => \App\Http\Middleware\RemoteAuth::class

现在在 Route 中使用这个remoteAuth中间件

Route::middleware('remoteAuth')->get('/test', function (Request $request) { 
    return 'Protected page'; 
});

希望它能给你一些想法。


推荐阅读