安装passport
composer require laravel/passport ‘7.5.0’
- 注:我安装的时候没有一开始没有加版本号,然后就报了如下错:
Installation failed, reverting ./composer.json to its original content.
加了版本号就好了,但我后来过了段时间尝试的时候,发现不加也可以,加了反而报错,23333
执行迁移
php artisan migrate
这一步我也不知道该怎么说了
php artisan passport:install
修改文件
- 在
User
模型中,加入use Laravel\Passport\HasApiTokens;
然后在类中引用该traituse Notifiable,HasApiTokens;
- 在
Providers/AuthServiceProvider.php
的boot
方法中加入:
Passport::routes();
- 修改
config/auth.php
文件中的guards
中的api
中的driver
为passport
为了实现注册后就直接登录,还需安装guzzlehttp
版本可以自选
composer require guzzlehttp/guzzle '6.5.2'
注册代码
<?php
namespace App\Http\Controllers;
use App\Http\Requests\RegisterUserRequest;
use App\User;
use GuzzleHttp\Client;
class RegisterController extends Controller
{
private $http;
public function __construct(Client $http)
{
$this->http = $http;
}
public function register(RegisterRequest $request)
{
// 创建用户
User::create([
'name' => $request->input('name'),
'email' => $request->input('email'),
'password' => bcrypt($request->input('password'))
]);
// 获取创建用户的access_token作为登录凭证,登录的时候其实也是这样获取access_token的
$response = $this->http->post('http://api.test/oauth/token', [
'form_params' => [
"grant_type" => "password",
// 此处用的是用户邮箱验证
// 后来我尝试使用上面创建用户后返回的信息,如赋值给$user之后,下面的username和password使用的是$user->email和$user->password的时候,会报如下的错 : Client error: `POST http://taking.test/oauth/token` resulted in a `400 Bad Request` response:\n{\"error\":\"invalid_grant\",\"error_description\":\"The provided authorization grant (e.g., authorization code, resource owner (truncated...)\n
// 但是使用$request的话就正确
"username" => $request->input('email'),
"password" => $request->input('password'),
// 此处是oauth_clients数据表中有两个值,用的是id=2的值
"client_id" => "2",
"client_secret" => "LQ1a8TAUMjXw3CBpwGR2uLXlNWOuqJOG7Cpsnprq",
// 设置api的范围权限全局访问
"scope" => "*"
]
]);
$token = json_decode((string)$response->getBody(), true);
return response()->json([
'token' => $token
], 201);
}
}
- 返回内容如下
- 在返回的内容中有
access_token
,可以拿他获取用户信息
- 其中
passport
也是可以实现自定义使用用户名或者手机号登录的,只需要在用户模型
中复写一个方法即可,如下:
public function findForPassport($username)
{
return $this->orwhere('name', $username)->orwhere('email',$username)->first();
}
- 这个时候是有一个需要注意的地方的,上面修改的时候,我一开始用的
where
并不是orwhere
,然后就会报一个错,如下
“message”: "Client error:
POST http://taking.test/oauth/token
resulted in a400 Bad Request
response:\n{“error”:“invalid_grant”,“error_description”:“The provided authorization grant (e.g., authorization code, resource owner (truncated…)\n”,
“exception”: “GuzzleHttp\Exception\ClientException”
- 我的解决办法就是改用
orwhere
,这样既可以使用用户名登录,也可以使用邮箱登录,完美