Laravel API Token 体验

适用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
file

配置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/119000000621551...

本作品采用《CC 协议》,转载必须注明作者和本文链接
本帖由 Summer 于 3年前 加精
《L01 基础入门》
我们将带你从零开发一个项目并部署到线上,本课程教授 Web 开发中专业、实用的技能,如 Git 工作流、Laravel Mix 前端工作流等。
《L05 电商实战》
从零开发一个电商项目,功能包括电商后台、商品 & SKU 管理、购物车、订单管理、支付宝支付、微信支付、订单退款流程、优惠券等
讨论数量: 3

您好,按照上面的说法我设置了api_token字段并注册了一个用户,但使用默认api路由时却返回到/home,请问这是什么原因?

2年前 评论
Klightsaber 2年前
stella_sex 2年前

api_token 不正确的时候无返回值这个如何处理呢

1年前 评论

真的很不错,直接用token 获取!用户个人信息!

1年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!