Laravel API Token 体验 | Laravel China 社区 - 高品质的 Laravel 和 PHP 开发者社区

[Laravel API Token 体验 | Laravel China 社区 - 高品质的 Laravel 和 PHP 开发者社区]

适用laravel版本5.3+

简介

Laravel API 默认驱动为token,文档上没介绍如何使用,下面让我们来实现它。

        'api' => [
            'driver' => 'token',
            'provider' => 'users',
        ],

配置字段

项目下执行命令php artisan make:migration update_users_table_for_api_token --table=users生成迁移文件.

修改迁移文件

    /**
     * Run the migrations.
     *
     * @return void
     */
  public function up()
    {
        Schema::table('users', function (Blueprint $table) {
            //字段名固定,长度建议32以上
            $table->string('api_token', 64)->unique();
        });
    }

    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        Schema::table('users', function (Blueprint $table) {
            $table->dropColumn('api_token');
        });
    }

项目下执行命令php artisan migrate执行迁移。数据表users会添加api_token字段

配置模型

添加api_tokenUser模型$fillable$hidden属性

    /**
     * The attributes that are mass assignable.
     *
     * @var array
     */
    protected $fillable = [
        'name', 'email', 'password','api_token',
    ];

    /**
     * The attributes that should be hidden for arrays.
     *
     * @var array
     */
    protected $hidden = [
        'password', 'remember_token','api_token'
    ];

生成api_token

代码放在注册控制器app/Http/Controllers/Auth/RegisterController.php里面。

    /**
     * Create a new user instance after a valid registration.
     *
     * @param  array  $data
     * @return \App\User
     */
    protected function create(array $data)
    {
        return User::create([
            'name' => $data['name'],
            'email' => $data['email'],
            'password' => bcrypt($data['password']),
            'api_token' =>str_random(64)
        ]);
    }

用户注册成功后自动分配一个api_token
[](https://lccdn.phphub.org/uploads/images/201710/17/19415/MIwKt2GBTo.png)

[file

](https://lccdn.phphub.org/uploads/images/201710/17/19415/MIwKt2GBTo.png)

配置API路由

routes/api.php里面配置路由,使用token方式时一定要使用中间件auth:api
系统已经帮我们配置了一个Api路由,我们可以直接使用这个路由测试。

use Illuminate\Http\Request;

/*
|--------------------------------------------------------------------------
| 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::middleware('auth:api')->get('/user', function (Request $request) {
    return $request->user();
});

通过api_token获取用户

  • 通过GETPOST发送api_token字段数据获取用户。
  • 通过header头部发送Authorization获取用户。
 //方式GuzzleHttp\Client
 //假如你的token为DntgHWoEanBSYeMv,为了显示效果截取了长度
 //GuzzleHttp\Client方式
    $guzzle = new GuzzleHttp\Client;
        $response = $guzzle->get('http://mysite/api/user', [
            'headers' => [
                'Authorization' => 'Bearer DntgHWoEanBSYeMv',
            ],
        ]);

        print_r( json_decode((string) $response->getBody(), true));
 //假如你的token为DntgHWoEanBSYeMv,为了显示效果截取了长度
//jQuery方式
    $.ajaxSetup({
        headers:{
                Authorization:'Bearer DntgHWoEanBSYeMv'
        }
    });

    $.get('http://yoursite.com/api/user').
    then(function(data) {
       console.log(data);
    });

//axios方式
axios.defaults.headers.common['Authorization'] = 'Bearer DntgHWoEanBSYeMv';

axios.get('http://yoursite.com/api/user')
  .then(function(response) {
       console.log(response.data);
    });

_注意这里有跨域问题,可以设置Access-Control-Allow系列header解决跨域问题,
也有现成的中间件barryvdh/laravel-cors可以使用。_

[参考] https://segmentfault.com/a/1190000006215513

Original url: Access

Created at: 2018-10-10 14:29:01

Category: default

Tags: none

请先后发表评论
  • 最新评论
  • 总共0条评论