Laravel5.3에서는 Passport를 API 인증으로 사용하기 시작했습니다. 다음 글에서는 주로 Laravel5.5에서 Passport를 사용하여 Auth 인증을 구현하는 방법을 샘플 코드를 통해 소개합니다. 친구가 참조할 수 있으므로 모든 사람에게 도움이 되기를 바랍니다.
머리말
최근 프론트엔드와 백엔드 분리 프로젝트를 작성하고 있는데 원래는 Jwt-auth + Dingo를 이용해서 개발하려고 했는데 좀 귀찮아서 라라벨을 생각하게 되었어요. 5.5의 Passport 및 새로운 Api 리소스. Laravel Passport는 패키지된 OAuth2 서버 구현입니다.
OAuth는 인증을 위한 개방형 네트워크 표준이며 현재 버전은 2.0입니다.
OAuth 2.0은 현재 널리 사용되는 접근 방식으로 Google, Yahoo, Microsoft, Facebook 등에서 처음 사용되었습니다. 2.0이라고 표기한 이유는 원래 1.0 프로토콜도 있었으나 이 1.0 프로토콜은 너무 복잡하고 사용하기 쉽지 않게 만들어져 대중화되지 못했기 때문이다. 2.0은 간단하고 명확한 프로토콜을 갖춘 새로운 디자인이지만 1.0과 호환되지 않으며 1.0과 아무런 관련이 없습니다.
여기서는 자세히 설명하지 않고 먼저 설치 방법부터 살펴보겠습니다.
Install
Install Passport
1. Shell에서 다음 명령을 실행하세요
composer require laravel/passport
수동으로 구성/ app.php 파일의 공급자 배열에 다음 코드를 추가합니다
Laravel\Passport\PassportServiceProvider::class,
2. 마이그레이션 파일을 실행합니다
쉘에서 다음 명령을 실행합니다
php artisan migrate
Passport 서비스 공급자 프레임워크를 사용하여 마이그레이션 디렉터리를 등록하므로 서비스를 등록한 후 직접 php artisan migration을 실행하여 Passport
3에 필요한 데이터 테이블을 생성할 수 있습니다. 암호화 키 생성
셸에서 다음 명령을 실행하세요
php artisan passport:install
이 명령은 보안 액세스 토큰을 생성하는 데 필요한 암호화 키를 생성하는 동시에 액세스 토큰을 생성하는 데 사용되는 "개인 액세스" 클라이언트와 "비밀번호 인증"도 생성합니다.
4. Trait 추가
AppUser 모델
<?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; }
5에 LaravelPassportHasApiTokens 트레이트를 추가합니다. AuthServiceProvider의 부팅 메서드에서
함수를 호출합니다. . Passport::routes
class AuthServiceProvider extends ServiceProvider { public function boot() { $this->registerPolicies(); Passport::routes(); } }
Passport::routes(function(RouteRegistrar $router) { $router->forAccessTokens(); },['prefix' => 'api/oauth']);
6. 가드 드라이버 변경
'guards' => [ 'web' => [ 'driver' => 'session', 'provider' => 'users', ], 'api' => [ 'driver' => 'passport', 'provider' => 'users', ], ],
function respond($status, $respond) { return response()->json(['status' => $status, is_string($respond) ? 'message' : 'data' => $respond]); } function succeed($respond = 'Request success!') { return respond(true, $respond); } function failed($respond = 'Request failed!') { return respond(false, $respond); }
下面是代码实现,我在 AppHttpControllersTraits 下新建了一个 ProxyHelpers 的 Trait,当然,这个函数是我根据我的业务逻辑自己封装的,如果不适合你的业务逻辑你可以自行调整。
<?php namespace App\Http\Controllers\Traits; use GuzzleHttp\Client; use App\Exceptions\UnauthorizedException; use GuzzleHttp\Exception\RequestException; trait ProxyHelpers { public function authenticate() { $client = new Client(); try { $url = request()->root() . '/api/oauth/token'; $params = array_merge(config('passport.proxy'), [ 'username' => request('email'), 'password' => request('password'), ]); $respond = $client->request('POST', $url, ['form_params' => $params]); } catch (RequestException $exception) { throw new UnauthorizedException('请求失败,服务器错误'); } if ($respond->getStatusCode() !== 401) { return json_decode($respond->getBody()->getContents(), true); } throw new UnauthorizedException('账号或密码错误'); } }
config/passport.php 内容如下
<?php return [ 'proxy' => [ 'grant_type' => env('OAUTH_GRANT_TYPE'), 'client_id' => env('OAUTH_CLIENT_ID'), 'client_secret' => env('OAUTH_CLIENT_SECRET'), 'scope' => env('OAUTH_SCOPE', '*'), ], ];
env 文件内容如下
OAUTH_GRANT_TYPE=password OAUTH_CLIENT_ID=2 OAUTH_CLIENT_SECRET=2HaTQJF33Sx98HjcKDiSVWZjrhVYGgkHGP8XLG1O OAUTH_SCOPE=*
我们需要用到的 client token 是 id 为 2 的 client token,不要搞错了哟~
然后我们只需要在控制器中 use 这个 Trait,然后调用 $this->authenticate()
就可以得到认证成功的 token,如果请求失败的话,你可以使用 catch 来捕捉错误抛出异常。
public function login(Request $request) { $needs = $this->validate($request, rules('login')); $user = User::where('email', $needs['email'])->first(); if (!$user) { throw new UnauthorizedException('此用户不存在'); } $tokens = $this->authenticate(); return succeed(['token' => $tokens, 'user' => new UserResource($user)]); }
得到的 tokens 返回如以下格式
{ "token_type": "Bearer", "expires_in": 31536000, "access_token": "token_str", "refresh_token": "token_str" }
做完这一切后你就可以在前端向这样子请求服务端了
axios.post('yourdomain/login',login_form).then(resource => { })
如果请求成功,那么你将会得到 用户的信息和 access token,refresh token。
然后在你的前端 http 请求 header 里需要加入一个参数 Authorization
axios.defaults.headers.common['Authorization'] = token.token_type + ' ' + token.access_token
然后在你需要使用到 auth 认证的路由里使用中间件 auth:api,一切就大功告成啦~
相关推荐:
Laravel5.5中的Package Auto Discovery详情介绍
위 내용은 Laravel5.5에서 Passport를 사용하여 인증 인증을 구현하는 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!