API 시나리오에서 인증 요구 사항을 충족하는 방법은 무엇입니까?

零下一度
풀어 주다: 2023-03-10 16:08:01
원래의
1569명이 탐색했습니다.

소개

Laravel에서는 기존 형식을 기반으로 로그인 및 인증을 구현하는 것이 매우 간단하지만 API 시나리오에서 인증 요구 사항을 충족하는 방법은 무엇입니까? API 시나리오에서 사용자 인증은 일반적으로 요청 간 세션 상태를 유지하는 대신 토큰을 통해 구현됩니다. 이제 Passport를 사용하여 Laravel 프로젝트에서 API 인증 프로세스를 쉽게 구현할 수 있습니다. Passport를 사용하면 몇 분 안에 애플리케이션에 완전한 OAuth2 서버 구현을 추가할 수 있습니다.


설치

Composer 종속성 패키지 관리자를 사용하여 Passport를 설치합니다.

 composer require laravel/passport
로그인 후 복사

다음으로 구성 파일 config/app.php의 공급자 배열에 Passport 서비스 공급자를 등록합니다.

Laravel\Passport\PassportServiceProvider::class
로그인 후 복사

Passport 사용 서비스 제공업체는 내부 데이터베이스 마이그레이션 스크립트 디렉터리를 등록하므로 이전 단계가 완료된 후 데이터베이스 구조를 업데이트해야 합니다. Passport의 마이그레이션 스크립트는 애플리케이션에 필요한 클라이언트 데이터 테이블과 토큰 데이터 테이블을 자동으로 생성합니다.

php artisan migrate
로그인 후 복사

다음으로 Passport:install 명령을 실행하여 동시에 보안 액세스 토큰을 생성하는 데 사용되는 암호화 키를 생성해야 합니다. 시간이 지나면 이 명령은 "개인 액세스" 클라이언트 및 "비밀번호 인증" 클라이언트도 생성합니다:

php artisan passport:install
로그인 후 복사

위 명령이 실행된 후 AppUser.php를 수정하여 인증된 사용자 도메인의 토큰 및 사용량을 확인합니다:

<?php

namespace App;use Laravel\Passport\HasApiTokens; // 新增use Illuminate\Notifications\Notifiable;use Illuminate\Foundation\Auth\User as Authenticatable;class User extends Authenticatable
{use HasApiTokens, Notifiable; // 增加 HasApiTokens
로그인 후 복사

다음으로 AuthServiceProvider의 부팅 메소드에서 Passport::routes 함수를 호출해야 합니다. 이 기능은 액세스 토큰, 클라이언트 및 개인 액세스 토큰의 발급 및 취소 프로세스에 사용될 몇 가지 필수 경로를 등록합니다.

Modify AppProvidersAuthServiceProvider.php:

<?php

namespace App\Providers;use Laravel\Passport\Passport; // 新增use Illuminate\Support\Facades\Gate;use Illuminate\Foundation\Support\Providers\AuthServiceProvider as ServiceProvider;use Carbon\Carbon; // 新增引用class AuthServiceProvider extends ServiceProvider
{/**
     * The policy mappings for the application.
     *
     * @var array     */protected $policies = [&#39;App\Model&#39; => 'App\Policies\ModelPolicy',];/**
     * Register any authentication / authorization services.
     *
     * @return void     */public function boot()
    {$this->registerPolicies();

        Passport::routes(); // 注册passport路由

        //令牌的有效期Passport::tokensExpireIn(Carbon::now()->addDays(15));

        Passport::refreshTokensExpireIn(Carbon::now()->addDays(30));
    }
}
로그인 후 복사

마지막으로 구성 파일 config를 변경해야 합니다. / auth.php의 api 부분에 있는 인증보호 항목(드라이버)이 여권으로 변경되었습니다. 이렇게 조정하면 애플리케이션이 API로부터 인증 요청을 받을 때 Passport의 TokenGuard를 사용하게 됩니다.

'guards' => ['web' => ['driver' => 'session',
        'provider' => 'users',],

    'api' => ['driver' => 'passport', // 改为passport'provider' => 'users',],],
로그인 후 복사

Test

api의 경로는 api.php입니다. Routesapi.php를 열고 테스트 경로를 추가하세요.

Route::group(['namespace' => 'api'], function () {
    Route::post('/login', 'UserController@login');
});

Route::group(['middleware' => 'auth:api', 'namespace' => 'api'], function() {
    Route::get('details', 'UserController@details');
});
로그인 후 복사

하나는 로그인하여 토큰을 얻는 데 사용되고, 다른 하나는 얻은 토큰으로 로그인 인증을 완료하고 현재 사용자 정보를 얻는 데 사용됩니다.

세부 정보 라우팅은 auth:api 미들웨어를 사용하여 토큰을 확인합니다.

AppHttp 디렉터리에 api 폴더를 생성하고 UserController.php를 추가합니다.

<?php

namespace App\Http\Controllers\api;use Illuminate\Http\Request;use App\Http\Controllers\Controller;use Illuminate\Support\Facades\Auth;use App\User;use Response;class UserController extends Controller
{public function __construct()
    {$this->content = array();
    }public function login()
    {if(Auth::attempt(['email' => request('email'), 'password' => request('password')]))
        {$user = Auth::user();$this->content['token'] =  $user->createToken('Pizza App')->accessToken;$status = 200;
        } else {$this->content['error'] = "未授权";             $status = 401;
        }         return response()->json($this->content, $status);    
    }public function details()
    {return response()->json(['user' => Auth::user()]);
    }
}
로그인 후 복사

postman에서 테스트:

위 그림과 같이 로그인 방법이 경로와 일치해야 하며 post 방법을 사용하여 전송해야 합니다. 양식에 사용자 이메일과 비밀번호를 api/login

올바르게 전달하면 위 그림의 토큰을 받게 됩니다

이전 단계에서 얻은 토큰을 헤더에 추가합니다. 'Bearer' 토큰 앞에 추가하세요. 그러면 현재 사용자의 정보를 얻을 수 있습니다. 즉, 사용자 인증이 완료됩니다.

위 내용이 완전히 정확하다는 보장은 없습니다. 내 GitHub 코드 보기에 오신 것을 환영합니다.

위 내용은 API 시나리오에서 인증 요구 사항을 충족하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿