我可以使用 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);

来自Password Grant Tokens