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_token
和 refresh_token
。但是如何为登录路由实现这个呢?
我发现我们可以使用以下代码向 http://127.0.0.1:8000/oauth/token
路由发送 post 请求,但是...保存 client_id
和 client_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 细节以继续流程。
我正在使用 laravel 5.6
并且 passport 已安装并且可以使用。我想通过从 ionic 3 应用程序发送 post 请求来登录用户。我想知道如何制作登录路线。
我已经创建了正在运行的创建帐户路由,并且在用户创建帐户后 returns access_token
和 refresh_token
。但是如何为登录路由实现这个呢?
我发现我们可以使用以下代码向 http://127.0.0.1:8000/oauth/token
路由发送 post 请求,但是...保存 client_id
和 client_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 细节以继续流程。