我可以使用 api 和 laravel 的身份验证结构进行身份验证吗?
Can i auth with api with auth structure of laravel?
我想制作一个 API 用于前端和管理面板,使用 Laravel 身份验证结构(使用 make:auth)和 API 身份验证(使用护照)用于管理所有操作操作。
我的"routes/api.php"文件;
Route::group(['namespace' => 'Admin', 'prefix' => 'admin', 'as' => 'api.admin.'], function () {
Route::post('login', 'Auth\LoginController@login')->name('login');
Route::post('logout', 'Auth\LoginController@logout')->name('logout');
Route::group(['middleware' => 'auth:api'], function () {
//
});
});
我的Auth\LoginController文件;
<?php
namespace App\Http\Controllers\Admin\Auth;
use App\Http\Controllers\Controller;
use Illuminate\Foundation\Auth\AuthenticatesUsers;
use Illuminate\Http\Request;
class LoginController extends Controller
{
/*
|--------------------------------------------------------------------------
| Login Controller
|--------------------------------------------------------------------------
|
| This controller handles authenticating users for the application and
| redirecting them to your home screen. The controller uses a trait
| to conveniently provide its functionality to your applications.
|
*/
use AuthenticatesUsers;
/**
* Where to redirect users after login.
*
* @var string
*/
protected $redirectTo = '/admin';
/**
* Create a new controller instance.
*
* @return void
*/
public function __construct()
{
$this->middleware('guest')->except('logout');
}
/**
* Show the application's login form.
*
* @return \Illuminate\Http\Response
*/
public function showLoginForm()
{
return view('admin.auth.login');
}
public function logout(Request $request)
{
auth()->logout();
session()->flash('message', 'Some goodbye message');
return redirect()->route('admin.login');
}
}
当我使用 post 方法和 "email"、"password" 数据调用“/api/admin/login” url 时,出现 returns 错误;
RuntimeException
Session store not set on request.
我认为在 Kernel.php api 组的 $middlewareGroup 中使用以下方法解决了上述错误;
我的 app/Http/Kernel.php 文件;
\App\Http\Middleware\EncryptCookies::class,
\Illuminate\Session\Middleware\StartSession::class
未根据请求设置会话存储。 错误已解决,但现在 returns MethodNotAllowedHttpException。
我可以用其他方法解决这些问题,但我想使用 Laravel.
的身份验证标准
这可能吗?
谢谢大家
尝试将会话作为中间件单独添加到 $middlewareGroups。
应该包含\Illuminate\Session\Middleware\StartSession::class,
protected $middlewareGroups = [
'web' => [
\App\Http\Middleware\EncryptCookies::class,
\Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse::class,
\Illuminate\Session\Middleware\StartSession::class,
\Illuminate\View\Middleware\ShareErrorsFromSession::class,
\App\Http\Middleware\VerifyCsrfToken::class,
],
'api' => [
'throttle:60,1',
],
'sessions' => [
\Illuminate\Session\Middleware\StartSession::class,
]
];
routes/api.php
Route::group(['middleware' => ['sessions']], function () {
Route::resource(...);
});
这是可能的,尽管它比切换登录要复杂一些 url。您打算 Password Grant Flow 以便用户可以使用他们现有的电子邮件和密码凭据进行身份验证。
您无需启用 session 即可工作。基本 运行 下来是你 post 你的电子邮件和密码到代理请求到 OAuth2 服务器的路由。您会将身份验证和刷新令牌转发回用户,然后用户负责使用 Authorization: Bearer LongEncryptedTokenHere...
header 将访问令牌附加到每个后续请求。
为了让事情变得更简单,Laravel 提供了 CreateFreshApiTokens
中间件,它会在每次请求时自动授权和刷新令牌。您可以阅读有关 Consuming Your API With JavaScript here.
使用 password
授权和 Guzzle 请求令牌的示例:
$http = new GuzzleHttp\Client;
$response = $http->post('http://your-app.com/oauth/token', [
'form_params' => [
'grant_type' => 'password',
'client_id' => 'client-id',
'client_secret' => 'client-secret',
'username' => 'taylor@laravel.com',
'password' => 'my-password',
'scope' => '',
],
]);
return json_decode((string) $response->getBody(), true);
我想制作一个 API 用于前端和管理面板,使用 Laravel 身份验证结构(使用 make:auth)和 API 身份验证(使用护照)用于管理所有操作操作。
我的"routes/api.php"文件;
Route::group(['namespace' => 'Admin', 'prefix' => 'admin', 'as' => 'api.admin.'], function () {
Route::post('login', 'Auth\LoginController@login')->name('login');
Route::post('logout', 'Auth\LoginController@logout')->name('logout');
Route::group(['middleware' => 'auth:api'], function () {
//
});
});
我的Auth\LoginController文件;
<?php
namespace App\Http\Controllers\Admin\Auth;
use App\Http\Controllers\Controller;
use Illuminate\Foundation\Auth\AuthenticatesUsers;
use Illuminate\Http\Request;
class LoginController extends Controller
{
/*
|--------------------------------------------------------------------------
| Login Controller
|--------------------------------------------------------------------------
|
| This controller handles authenticating users for the application and
| redirecting them to your home screen. The controller uses a trait
| to conveniently provide its functionality to your applications.
|
*/
use AuthenticatesUsers;
/**
* Where to redirect users after login.
*
* @var string
*/
protected $redirectTo = '/admin';
/**
* Create a new controller instance.
*
* @return void
*/
public function __construct()
{
$this->middleware('guest')->except('logout');
}
/**
* Show the application's login form.
*
* @return \Illuminate\Http\Response
*/
public function showLoginForm()
{
return view('admin.auth.login');
}
public function logout(Request $request)
{
auth()->logout();
session()->flash('message', 'Some goodbye message');
return redirect()->route('admin.login');
}
}
当我使用 post 方法和 "email"、"password" 数据调用“/api/admin/login” url 时,出现 returns 错误;
RuntimeException
Session store not set on request.
我认为在 Kernel.php api 组的 $middlewareGroup 中使用以下方法解决了上述错误; 我的 app/Http/Kernel.php 文件;
\App\Http\Middleware\EncryptCookies::class, \Illuminate\Session\Middleware\StartSession::class
未根据请求设置会话存储。 错误已解决,但现在 returns MethodNotAllowedHttpException。
我可以用其他方法解决这些问题,但我想使用 Laravel.
的身份验证标准这可能吗?
谢谢大家
尝试将会话作为中间件单独添加到 $middlewareGroups。
应该包含\Illuminate\Session\Middleware\StartSession::class,
protected $middlewareGroups = [
'web' => [
\App\Http\Middleware\EncryptCookies::class,
\Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse::class,
\Illuminate\Session\Middleware\StartSession::class,
\Illuminate\View\Middleware\ShareErrorsFromSession::class,
\App\Http\Middleware\VerifyCsrfToken::class,
],
'api' => [
'throttle:60,1',
],
'sessions' => [
\Illuminate\Session\Middleware\StartSession::class,
]
];
routes/api.php
Route::group(['middleware' => ['sessions']], function () {
Route::resource(...);
});
这是可能的,尽管它比切换登录要复杂一些 url。您打算 Password Grant Flow 以便用户可以使用他们现有的电子邮件和密码凭据进行身份验证。
您无需启用 session 即可工作。基本 运行 下来是你 post 你的电子邮件和密码到代理请求到 OAuth2 服务器的路由。您会将身份验证和刷新令牌转发回用户,然后用户负责使用 Authorization: Bearer LongEncryptedTokenHere...
header 将访问令牌附加到每个后续请求。
为了让事情变得更简单,Laravel 提供了 CreateFreshApiTokens
中间件,它会在每次请求时自动授权和刷新令牌。您可以阅读有关 Consuming Your API With JavaScript here.
使用 password
授权和 Guzzle 请求令牌的示例:
$http = new GuzzleHttp\Client;
$response = $http->post('http://your-app.com/oauth/token', [
'form_params' => [
'grant_type' => 'password',
'client_id' => 'client-id',
'client_secret' => 'client-secret',
'username' => 'taylor@laravel.com',
'password' => 'my-password',
'scope' => '',
],
]);
return json_decode((string) $response->getBody(), true);