第一步
執行以下命令:
composer?require?laravel/passport php?artisan?migrate php?artisan?passport:install
第二步
修改 config/auth.php 文件中的 Gurds:
... ????'guards'?=>?[ ????????'web'?=>?[ ????????????'driver'?=>?'session', ????????????'provider'?=>?'users', ????????], ????????'api'?=>?[ ????????????'driver'?=>?'passport', ????????????'provider'?=>?'users', ????????], ????], ...
第三步
app/User.php
<?php namespace App; use IlluminateFoundationAuthUser as Authenticatable; use IlluminateNotificationsNotifiable; use LaravelPassportHasApiTokens; class User extends Authenticatable { use Notifiable, HasApiTokens; /** * The attributes that are mass assignable. * * @var array */ protected $fillable = [ 'name', 'email', 'password', ]; /** * The attributes that should be hidden for arrays. * * @var array */ protected $hidden = [ 'password', 'remember_token', ]; /** * The attributes that should be cast to native types. * * @var array */ protected $casts = [ 'email_verified_at' =>?'datetime', ????]; }
第四步
app/Repositories/User/UserRepositoryInterface.php
<?php namespace AppRepositoriesUser; use IlluminateHttpRequest; interface UserRepositoryInterface { public function register(Request $request); public function login(Request $request); public function refreshToken(Request $request); public function details(); public function logout(Request $request); public function response($data, int $statusCode); public function getTokenAndRefreshToken(string $email, string $password); public function sendRequest(string $route, array $formParams); public function getOClient(); }
第五步
創建 app/Repositories/User/UserRepository.php 文件
<?php namespace AppRepositoriesUser; use AppUser; use GuzzleHttpClient; use IlluminateHttpRequest; use IlluminateSupportFacadesAuth; use LaravelPassportClient as OClient; use GuzzleHttpExceptionClientException; use AppRepositoriesUserUserRepositoryInterface; class UserRepository implements UserRepositoryInterface { const SUCCUSUS_STATUS_CODE = 200; const UNAUTHORISED_STATUS_CODE = 401; const BASE_URL = "http://mylemp-nginx"; public function __construct(Client $client) { $this->http?=?$client; ????} ????public?function?register(Request?$request)?{ ????????$email?=?$request->email; ????????$password?=?$request->password; ????????$input?=?$request->all(); ????????$input['password']?=?bcrypt($input['password']); ????????User::create($input); ????????$response?=?$this->getTokenAndRefreshToken($email,?$password); ????????return?$this->response($response["data"],?$response["statusCode"]); ????} ????public?function?login(Request?$request)?{ ????????$email?=?$request->email; ????????$password?=?$request->password; ????????if?(Auth::attempt(['email'?=>?$email,?'password'?=>?$password]))?{ ????????????$response?=?$this->getTokenAndRefreshToken($email,?$password); ????????????$data?=?$response["data"]; ????????????$statusCode?=??$response["statusCode"]; ????????}?else?{ ????????????$data?=?['error'=>'Unauthorised']; ????????????$statusCode?=??self::UNAUTHORISED_STATUS_CODE; ????????} ????????return?$this->response($data,?$statusCode); ????} ????public?function?refreshToken(Request?$request)?{ ????????if?(is_null($request->header('Refreshtoken')))?{ ????????????return?$this->response(['error'=>'Unauthorised'],?self::UNAUTHORISED_STATUS_CODE); ????????} ????????$refresh_token?=?$request->header('Refreshtoken'); ????????$Oclient?=?$this->getOClient(); ????????$formParams?=?[?'grant_type'?=>?'refresh_token', ????????????????????????'refresh_token'?=>?$refresh_token, ????????????????????????'client_id'?=>?$Oclient->id, ????????????????????????'client_secret'?=>?$Oclient->secret, ????????????????????????'scope'?=>?'*']; ????????return?$this->sendRequest("/oauth/token",?$formParams); ????} ????public?function?details()?{ ????????$user?=?Auth::user(); ????????return?$this->response($user,?self::SUCCUSUS_STATUS_CODE); ????} ????public?function?logout(Request?$request)?{ ????????$request->user()->token()->revoke(); ????????return?$this->response(['message'?=>?'Successfully?logged?out'],?self::SUCCUSUS_STATUS_CODE); ????} ????public?function?response($data,?int?$statusCode)?{ ????????$response?=?["data"=>$data,?"statusCode"=>$statusCode]; ????????return?$response; ????} ????public?function?getTokenAndRefreshToken(string?$email,?string?$password)?{ ????????$Oclient?=?$this->getOClient(); ????????$formParams?=?[?'grant_type'?=>?'password', ????????????????????????'client_id'?=>?$Oclient->id, ????????????????????????'client_secret'?=>?$Oclient->secret, ????????????????????????'username'?=>?$email, ????????????????????????'password'?=>?$password, ????????????????????????'scope'?=>?'*']; ????????return?$this->sendRequest("/oauth/token",?$formParams); ????} ????public?function?sendRequest(string?$route,?array?$formParams)?{ ????????try?{ ????????????$url?=?self::BASE_URL.$route; ????????????$response?=?$this->http->request('POST',?$url,?['form_params'?=>?$formParams]); ????????????$statusCode?=?self::SUCCUSUS_STATUS_CODE; ????????????$data?=?json_decode((string)?$response->getBody(),?true); ????????}?catch?(ClientException?$e)?{ ????????????echo?$e->getMessage(); ????????????$statusCode?=?$e->getCode(); ????????????$data?=?['error'=>'OAuth?client?error']; ????????} ????????return?["data"?=>?$data,?"statusCode"=>$statusCode]; ????} ????public?function?getOClient()?{ ????????return?OClient::where('password_client',?1)->first(); ????} }
第六步
app/Http/Requests/UserLoginRequest.php
<?php namespace AppHttpRequests; use IlluminateFoundationHttpFormRequest; use IlluminateContractsValidationValidator; use IlluminateHttpExceptionsHttpResponseException; class UserLoginRequest extends FormRequest { const UNPROCESSABLE_ENTITY = 422; public function rules() { return [ 'email' =>?'required|email', ????????????'password'?=>?'required', ??????????]; ????} ????protected?function?failedValidation(Validator?$validator)?{ ????????throw?new?HttpResponseException(response()->json($validator->errors(),?self::UNPROCESSABLE_ENTITY)); ????} }
第七步
app/Http/Requests/UserRegisterRequest.php
<?php namespace AppHttpRequests; use IlluminateFoundationHttpFormRequest; use IlluminateContractsValidationValidator; use IlluminateHttpExceptionsHttpResponseException; class UserRegisterRequest extends FormRequest { const UNPROCESSABLE_ENTITY = 422; public function rules() { return [ 'name' =>?'required', ????????????'email'?=>?'required|email|unique:users', ????????????'password'?=>?'required', ????????????'c_password'?=>?'required|same:password', ??????????]; ????} ????protected?function?failedValidation(Validator?$validator)?{ ????????throw?new?HttpResponseException(response()->json($validator->errors(),?self::UNPROCESSABLE_ENTITY)); ????} }
第八步
app/Providers/AppServiceProvider.php
<?php namespace AppProviders; use AppRepositoriesUserUserRepository; use AppRepositoriesUserUserRepositoryInterface; use IlluminateSupportServiceProvider; class AppServiceProvider extends ServiceProvider { /** * Register any application services. * * @return void */ public function register() { $this->app->bind(UserRepositoryInterface::class,?UserRepository::class); ????} ????/** ?????*?Bootstrap?any?application?services. ?????* ?????*?@return?void ?????*/ ????public?function?boot()?{ ????????// ????} }
第九步
app/Providers/AuthServiceProvider.php
<?php namespace AppProviders; use IlluminateFoundationSupportProvidersAuthServiceProvider as ServiceProvider; use LaravelPassportPassport; class AuthServiceProvider extends ServiceProvider { /** * The policy mappings for the application. * * @var array */ protected $policies = [ // 'AppModel' =>?'AppPoliciesModelPolicy', ????]; ????/** ?????*?Register?any?authentication?/?authorization?services. ?????* ?????*?@return?void ?????*/ ????public?function?boot()?{ ????????$this->registerPolicies(); ????????Passport::routes(); ????} }
第十步
app/Http/Controllers/UserController.php
<?php namespace AppHttpControllers; use IlluminateHttpRequest; use AppHttpRequestsUserLoginRequest; use AppHttpRequestsUserRegisterRequest; use AppRepositoriesUserUserRepositoryInterface; class UserController extends Controller { const SUCCUSUS_STATUS_CODE = 200; const UNAUTHORISED_STATUS_CODE = 401; public function __construct(UserRepositoryInterface $userRepository) { $this->userRepository?=?$userRepository; ????} ????public?function?login(UserLoginRequest?$request)?{ ????????$response?=?$this->userRepository->login($request); ????????return?response()->json($response["data"],?$response["statusCode"]); ????} ????public?function?register(UserRegisterRequest?$request)?{ ????????$response?=?$this->userRepository->register($request); ????????return?response()->json($response["data"],?$response["statusCode"]); ????} ????public?function?details()?{ ????????$response?=?$this->userRepository->details(); ????????return?response()->json($response["data"],?$response["statusCode"]); ????} ????public?function?logout(Request?$request)?{ ????????$response?=?$this->userRepository->logout($request); ????????return?response()->json($response["data"],?$response["statusCode"]); ????} ????public?function?refreshToken(Request?$request)?{ ????????$response?=?$this->userRepository->refreshToken($request); ????????return?response()->json($response["data"],?$response["statusCode"]); ????} }
第十一步
routes/api.php
<?php use IlluminateSupportFacadesRoute; Route::post('login', 'UserController@login'); Route::post('register', 'UserController@register'); Route::post('refreshtoken', 'UserController@refreshToken'); Route::group(['middleware' =>?['auth:api']],?function?()?{ ????Route::post('logout',?'UserController@logout'); ????Route::post('details',?'UserController@details'); });
推薦教程:《Laravel教程》
? 版權聲明
文章版權歸作者所有,未經允許請勿轉載。
THE END