zoukankan      html  css  js  c++  java
  • Laravel5.4 Oauth2.0认证应用 API 实战!



    项目初始化

    新建项目

    lukeyans-MacBook-Pro:laravel lukeyan$ laravel new laravel_demo
    

    添加laravel自带的Passport服务

    lukeyans-MacBook-Pro:laravel_demo lukeyan$ composer require laravel/passport
    

    接下来,将 Passport 的服务提供者注册到配置文件 config/app.php 的 providers 数组中:

    LaravelPassportPassportServiceProvider::class,
    

    在.env 文件配置好数据链接,因为我本地的数据库版本是

    服务器: Localhost via UNIX socket
    服务器类型: MariaDB
    服务器版本: 10.1.16-MariaDB - Source distribution
    

    laravel 5.4 改变了默认的数据库字符集,现在utf8mb4包括存储emojis支持。
    而我的版本比较低一点(高于 10.2.2 版本的不需要理会),不支持,得修改一下字符串的长度。

    修改

    在 AppServiceProvider.php 文件里的 boot 方法里设置一个默认值

    <?php
    
    namespace AppProviders;
    
    use IlluminateSupportServiceProvider;
    use IlluminateSupportFacadesSchema;   //新增的
    
    class AppServiceProvider extends ServiceProvider
    {
        /**
         * Bootstrap any application services.
         *
         * @return void
         */
        public function boot()
        {
            Schema::defaultStringLength(191);  //新增的
        }
    }
    

    Passport 使用服务提供者注册内部的数据库迁移脚本目录,所以上一步完成后,你需要更新你的数据库结构。Passport 的迁移脚本会自动创建应用程序需要的客户端数据表和令牌数据表:

    php artisan make:auth //先生成基础的用户数据库表
    php artisan migrate //再更新
    

    接下来,你需要运行 passport:install 命令来创建生成安全访问令牌时用到的加密密钥,同时,这条命令也会创建「私人访问」客户端和「密码授权」客户端:

    php artisan passport:install
    

    上面命令执行后,请将 LaravelPassportHasApiTokens Trait 添加到 AppUser 模型中,这个 Trait 会给你的模型提供一些辅助函数,用于检查已认证用户的令牌和使用作用域:

    <?php
    
    namespace App;
    
    use LaravelPassportHasApiTokens;
    use IlluminateNotificationsNotifiable;
    use IlluminateFoundationAuthUser as Authenticatable;
    
    class User extends Authenticatable
    {
        use HasApiTokens, Notifiable;
    }
    

    接下来,需要在 AuthServiceProvider 的 boot 方法中调用 Passport::routes 函数。这个函数会注册一些在访问令牌、客户端、私人访问令牌的发放和吊销过程中会用到的必要路由:

    <?php
    
    namespace AppProviders;
    
    use LaravelPassportPassport;
    use IlluminateSupportFacadesGate;
    use IlluminateFoundationSupportProvidersAuthServiceProvider as ServiceProvider;
    
    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();
        }
    }
    

    最后,需要将配置文件 config/auth.php 中 api 部分的授权保护项( driver )改为 passport 。此调整会让你的应用程序在接收到 API 的授权请求时使用 Passport 的 TokenGuard 来处理:

    'guards' => [
        'web' => [
            'driver' => 'session',
            'provider' => 'users',
        ],
    
        'api' => [
            'driver' => 'passport',
            'provider' => 'users',
        ],
    ],
    

    接下来,增加API的路由,好实现用户的

    1. 新增
    2. 登录
    3. 查看详情的功能
      打开 routes/api.php 文件添加
    <?php
    
    /*
    |--------------------------------------------------------------------------
    | API Routes
    |--------------------------------------------------------------------------
    |
    | Here is where you can register API routes for your application. These
    | routes are loaded by the RouteServiceProvider within a group which
    | is assigned the "api" middleware group. Enjoy building your API!
    |
    */
    
    Route::post('login', 'APIUserController@login');
    Route::post('register', 'APIUserController@register');
    
    Route::group(['middleware' => 'auth:api'], function(){
        Route::post('details', 'APIUserController@details');
    });
    

    接着增加控制器,在APP/HTTP/Controller 目录新增一个专门的API文件夹放

    lukeyans-MacBook-Pro:laravel_demo lukeyan$ php artisan make:controller Api/UserController
    

    增加对应路由指向的api的方法

    <?php
    
    namespace AppHttpControllersAPI;
    
    use IlluminateHttpRequest;
    use AppHttpControllersController;
    use AppUser;
    use IlluminateSupportFacadesAuth;
    use Validator;
    
    class UserController extends Controller
    {
    
        public $successStatus = 200;
    
        /**
         * login api
         *
         * @return IlluminateHttpResponse
         */
        public function login(){
            if(Auth::attempt(['email' => request('email'), 'password' => request('password')])){
                $user = Auth::user();
                $success['token'] =  $user->createToken('MyApp')->accessToken;
                return response()->json(['success' => $success], $this->successStatus);
            }
            else{
                return response()->json(['error'=>'Unauthorised'], 401);
            }
        }
    
        /**
         * Register api
         *
         * @return IlluminateHttpResponse
         */
        public function register(Request $request)
        {
            $validator = Validator::make($request->all(), [
                'name' => 'required',
                'email' => 'required|email',
                'password' => 'required',
                'c_password' => 'required|same:password',
            ]);
    
            if ($validator->fails()) {
                return response()->json(['error'=>$validator->errors()], 401);            
            }
    
            $input = $request->all();
            $input['password'] = bcrypt($input['password']);
            $user = User::create($input);
            $success['token'] =  $user->createToken('MyApp')->accessToken;
            $success['name'] =  $user->name;
    
            return response()->json(['success'=>$success], $this->successStatus);
        }
    
        /**
         * details api
         *
         * @return IlluminateHttpResponse
         */
        public function details()
        {
            $user = Auth::user();
            return response()->json(['success' => $user], $this->successStatus);
        }
    }
    

    好的,开始测试一下,我一般使用的调试工具是 postman

    1. 注册

    注册.png

    2.登录

    登录.png

    3.获取详情(需要注意一下,post提交时候需要配置一下 Headers)

    格式为

    Accept:application/json
    Authorization:Bearer+空格+access_token
    

    获取用户详情.png

    这样说明API的认证和测试正常啦

  • 相关阅读:
    第36课 经典问题解析三
    第35课 函数对象分析
    67. Add Binary
    66. Plus One
    58. Length of Last Word
    53. Maximum Subarray
    38. Count and Say
    35. Search Insert Position
    28. Implement strStr()
    27. Remove Element
  • 原文地址:https://www.cnblogs.com/mouseleo/p/8276789.html
Copyright © 2011-2022 走看看