Laravel中使用passport实现用户注册

安装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.phpboot方法中加入:
    Passport::routes();
  • 修改config/auth.php文件中的guards中的api中的driverpassport
为了实现注册后就直接登录,还需安装guzzlehttp

版本可以自选

composer require guzzlehttp/guzzle '6.5.2'

注册代码


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);
    }
}
  • 返回内容如下

Laravel中使用passport实现用户注册_第1张图片

  • 在返回的内容中有access_token,可以拿他获取用户信息

Laravel中使用passport实现用户注册_第2张图片

  • 其中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 a 400 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,这样既可以使用用户名登录,也可以使用邮箱登录,完美

你可能感兴趣的:(laravel)