이 글은 Laravel5.5에서 Auth 인증을 구현하기 위해 Passport를 사용하는 방법을 주로 소개하고 있습니다. 이제 필요한 친구들이 참고할 수 있도록 공유하겠습니다.
Laravel5.3에서는 Passport를 API 인증으로 사용하기 시작합니다. Passport OAuth2를 기반으로 하며, 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); }
2.服务端带着从前端接收到账号与密码,并在其中添加 Client_id 与 Client_token,然后带着这些参数请求自身的 Passport 认证路由,然后返回认证后的 Access token 与 refresh token
下面是代码实现,我在 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,一切就大功告成啦~
以上就是本文的全部内容,希望对大家的学习有所帮助,更多相关内容请关注PHP中文网!
相关推荐:
Laravel5.2使用Captcha生成验证码实现登录的方法
关于laravel 5.1下php artisan migrate的使用
위 내용은 Passport를 사용하여 Laravel5.5에서 인증 인증 구현의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!