基于laravel8创建passport 移动端认证
第一步:安装passport
composer require laravel/passport
第二步:迁移数据库 passport会自动创建多张表
包括一张users表 具体会不会覆盖原来的users同名表不太清楚 建议先把同名表改成别的名字
php artisan migrate
第三步:创建生成安全访问令牌(token)所需的加密键,此外,该命令还会创建“personal access”和“password grant”客户端用于生成访问令牌
php artisan passport:install
以上是基础操作
接下来才是我需要的步骤 因为我主要用passport验证移动端 后端系统管理还是用的session
- 将passport创建的
users
表改名为members
之前修改的同名表再改回去
第一步 移动端是面向用户的 创建用户模型
php artisan make:model Models/Member
第二步 member 模型内容
添加 Laravel\Passport\HasApiTokens
trait 到 member
模型
该 trait 将会为模型类提供一些辅助函数用于检查认证用户的 token 和 scope
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Foundation\Auth\User as Authenticatable;
use Laravel\Sanctum\HasApiTokens;
class Member extends Authenticatable
{
use HasApiTokens, HasFactory;
protected $table = 'members'; //指定表名members
public function findForPassport($username){
//设置验证的账号键
return $this->where('username',$username)->first();
}
}
第三步 在app/providers/AuthServiceProvider
的boot
方法中调用Passport::routes
方法,该方法将会为颁发访问令牌、撤销访问令牌、客户端以及私人访问令牌注册必要的路由
public function boot()
{
$this->registerPolicies();
Passport::routes();
}
第四步 在配置文件 config/auth.php 中,需要设置 api 认证 guard 的 driver 选项为 passport。这将告知应用在认证输入的 API 请求时使用 Passport 的 TokenGuard
provider 加上member
'guards' => [
'web' => [
'driver' => 'session',
'provider' => 'users',
],
'api' => [
'driver' => 'passport',
'provider' => 'members',
],
],
'providers' => [
'users' => [
'driver' => 'eloquent',
'model' => App\Models\User::class,
],
'members' => [
'driver' => 'eloquent',
'model' => App\Models\Member::class,
]
// 'users' => [
// 'driver' => 'database',
// 'table' => 'users',
// ],
],
第五步 注册移动端应用
php artisan passport:client --password
PS E:\phpstudy_pro\WWW\wechat> php artisan passport:client --password
What should we name the password grant client? [Laravel Password Grant Client]:
> members
Which user provider should this client use to retrieve users? [users]:
[0] users
[1] members
> 1
Password grant client created successfully.
Client ID: 3
Client secret: VFHqu0yB9xdiaO8T146855fFAzdynQO6Xp8ypyUQ
第六步 将获取到的clientid 与secret 保存到env文件中
CLIENT_ID=3
CLIENT_SECRET=VFHqu0yB9xdiaO8T146855fFAzdynQO6Xp8ypyUQ
第七步 在config/services.php
中新增配置项
'members' => [
'appid' => env('CLIENT_ID'),
'secret' => env('CLIENT_SECRET'),
]
第八步 创建登录路由 routes/api.php
中
Route::get('/auth/password', function (Request $request){
$http = new \GuzzleHttp\Client();
try {
$response = $http->post($request->root().'/oauth/token',[
'form_params' => [
'grant_type' => 'password',
'client_id' => config('services.members.client_id'),
'client_secret' => config('services.members.client_secret'),
'username' => 'member123',
'password' => '123456',
'scope' => '*',
],
]);
} catch (RequestException $requestExcepion) {
return json_encode(['code'=>401,'msg'=>'账号登陆失败,请重试!']);
}
if($response->getStatusCode() == 401){
return json_encode(['code'=>401,'msg'=>'账号登陆失败,请重试!']);
}
return json_encode(['code'=>200,'data'=>json_decode((string)$response)]);
});
简化测试了 实际 username和password需要在request中获取用户传过来的
开始测试 访问路由
成功获取到数据
- 返回结果中包含四个字段,access_token 是授权令牌,token_type 表示认证类型是 Bearer,我们可以将这个 access_token 值设置到 Bearer Authentication 请求头去请求需要认证的后端 API 接口。refresh_token 在令牌过期后刷新令牌时使用,最后 expires_in 表示令牌有效期(单位是秒,即有效期一年)
至于如何携带token访问与如何获取访问用户的数据
在请求头中添加Authorization
内容为
Bearer +你的token 注意Bearer后面有一个空格
Route::namespace('Member')->middleware('auth:api')->group(function(){
Route::get('user',function(){
$res = \Auth::user();//是的直接用Auth就能获取到!~!
var_dump($res);
return '成功';
});
});
特别注意 !!!!!!
middleware
中使用auth中间件一定要带上:api
如上代码
禁止使用passport的页面 也要改
比如 我的系统后台写在web.php
中 那么web中的路由middleware 要写上auth:web
不然用户在移动端登陆后 拿着token可以访问系统后台!!! 如下代码// 后台系统 Route::namespace('Admin')->middleware(['auth:web','admin_auth'])->group(function(){ // 后台主页 }
总结:
不要把passport
想象的太神秘了 laravel
yyds