Laravel 护照登录系统,如何登录用户并获取access_token 和刷新令牌?

Laravel passport login system, how to login the user and get access_token and refresh token?

我正在使用 laravel 5.6 并且 passport 已安装并且可以使用。我想通过从 ionic 3 应用程序发送 post 请求来登录用户。我想知道如何制作登录路线。

我已经创建了正在运行的创建帐户路由,并且在用户创建帐户后 returns access_tokenrefresh_token。但是如何为登录路由实现这个呢?

我发现我们可以使用以下代码向 http://127.0.0.1:8000/oauth/token 路由发送 post 请求,但是...保存 client_idclient_secret 是否安全在离子应用程序本身?

通过从 ionic 3 应用程序(或任何其他前端框架)发送 post 请求,使用 laravel 护照登录用户的最佳做法是什么?

{
    "grant_type" : "password",
    "client_id" : "2",
    "client_secret" : "HqLqRCRzNN2dwLWM1JhvCoNrbndwNSTGz515hSrswT",
    "username" : "test@test.com",
    "password" : "123456"  
}

2020 年更新

现在有一个替代 Passport 的方法来验证 SPA 和移动应用程序(也由 Laravel 维护):Laravel Sanctum

注意:此库需要 Laravel v6.9+。



原回答

公开 client-credentials 总是有风险的,因为您无法完全控制客户端应用程序。

如果您不想在 client-side 中存储此类数据,您可以做一个小代理来接收 username/password,然后完成添加护照客户详细信息的调用。

引用@adiachenko 的 this 回答:

routes/api.php

Route::post('auth/token', 'Api\Auth\DefaultController@authenticate');
Route::post('auth/refresh', 'Api\Auth\DefaultController@refreshToken');

app/Http/Controllers/Api/Auth/DefaultController.php

<?php

namespace App\Http\Controllers\Api\Auth;

use Illuminate\Http\Request;
use App\Http\Controllers\Controller;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Route;

class DefaultController extends Controller
{
    /**
     * @var object
     */
    private $client;

    /**
     * DefaultController constructor.
     */
    public function __construct()
    {
        $this->client = DB::table('oauth_clients')->where('id', 2)->first();
    }

    /**
     * @param Request $request
     * @return mixed
     */
    protected function authenticate(Request $request)
    {
        $request->request->add([
            'username' => $request->username,
            'password' => $request->password,
            'grant_type' => 'password',
            'client_id' => $this->client->id,
            'client_secret' => $this->client->secret,
            'scope' => '*'
        ]);

        $proxy = Request::create(
            'oauth/token',
            'POST'
        );

        return Route::dispatch($proxy);
    }

    /**
     * @param Request $request
     * @return mixed
     */
    protected function refreshToken(Request $request)
    {
        $request->request->add([
            'grant_type' => 'refresh_token',
            'refresh_token' => $request->refresh_token,
            'client_id' => $this->client->id,
            'client_secret' => $this->client->secret,
        ]);

        $proxy = Request::create(
            '/oauth/token',
            'POST'
        );

        return Route::dispatch($proxy);
    }
}

如您所见,您需要 POST 调用 /auth/token 发送用户凭据:

{ 
   "username" : "some@email.com",
   "password" : "some-awesome-password"
}

然后 authenticate 方法将完成 passport-client 细节以继续流程。