Laravel 7 教程:使用 Passport 来构建 API
今天我们要进行 Laravel Api 认证 请按照以下步骤进行应用程序身份验证和授权
第一步
执行以下命令:
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 Illuminate\Foundation\Auth\User as Authenticatable;
use Illuminate\Notifications\Notifiable;
use Laravel\Passport\HasApiTokens;
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 App\Repositories\User;
use Illuminate\Http\Request;
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 App\Repositories\User;
use App\User;
use GuzzleHttp\Client;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;
use Laravel\Passport\Client as OClient;
use GuzzleHttp\Exception\ClientException;
use App\Repositories\User\UserRepositoryInterface;
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 App\Http\Requests;
use Illuminate\Foundation\Http\FormRequest;
use Illuminate\Contracts\Validation\Validator;
use Illuminate\Http\Exceptions\HttpResponseException;
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 App\Http\Requests;
use Illuminate\Foundation\Http\FormRequest;
use Illuminate\Contracts\Validation\Validator;
use Illuminate\Http\Exceptions\HttpResponseException;
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 App\Providers;
use App\Repositories\User\UserRepository;
use App\Repositories\User\UserRepositoryInterface;
use Illuminate\Support\ServiceProvider;
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 App\Providers;
use Illuminate\Foundation\Support\Providers\AuthServiceProvider as ServiceProvider;
use Laravel\Passport\Passport;
class AuthServiceProvider extends ServiceProvider {
/**
* The policy mappings for the application.
*
* @var array
*/
protected $policies = [
// 'App\Model' => 'App\Policies\ModelPolicy',
];
/**
* Register any authentication / authorization services.
*
* @return void
*/
public function boot() {
$this->registerPolicies();
Passport::routes();
}
}
第十步
app/Http/Controllers/UserController.php
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use App\Http\Requests\UserLoginRequest;
use App\Http\Requests\UserRegisterRequest;
use App\Repositories\User\UserRepositoryInterface;
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 Illuminate\Support\Facades\Route;
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');
});
测试
打开 postman 增加请求头
Accept : application/json
然后这样处理
你可以在 这儿 找到源代码
今天我们要进行 Laravel Api 认证 请按照以下步骤进行应用程序身份验证和授权
原文地址:https://dev.to/azibom/how-do-you-make-la... 译文地址:https://learnku.com/laravel/t/45708 a
我的官方群点击此处。链接加入群聊【PHP/web/高级学习交流群】,一起学习,相互讨论。
群内已经有管理将知识体系整理好(源码,学习视频等资料),欢迎加群免费领取。
这套精品PHP教程绝不是市场上的那些妖艳贱货可比,作为web开发的佼佼者PHP并不逊色其他语言,加上Swoole后更加是如虎添翼!进军通信 、物联网行业开发百度地图、百度订单中心、虎牙、战旗TV等!寒冬裁员期过后正是各大企业扩大招人的时期,现在市场初级程序员泛滥,进阶中高级程序员绝对是各大企业急需的人才,这套学习教程适合那些1-5年以内的PHP开发者正处于瓶颈期,想要突破自己进阶中高级、架构师!名额有限,先到先得!
腾讯T3-T4标准精品PHP架构师教程目录大全,只要你看完保证薪资上升一个台阶(持续更新)
部分资料截图:
还有限时精品福利:
★腾讯高级PHP工程师笔试题目
★亿级PV高并发场景订单的处理
★laravel开发天猫商城组件服务
★战旗TV视频直播的架构项目实战
扫描下面二维码领取
对PHP后端技术,对PHP架构技术感兴趣的朋友,我的官方群点击此处,一起学习,相互讨论。
群内已经有管理将知识体系整理好(源码,学习视频等资料),欢迎加群免费领取。
本课程深度对标腾讯T3-T4标准,贴身打造学习计划为web开发人员进阶中高级、架构师提升技术,为自己增值涨薪!加入BAT特训营还可以获得内推大厂名额以及GO语言学习权限!!!