laravel5.4的api路由必须要给user表添加api_token字段?

zouliming
  • 135

有大半年没用laravel了,最近用laravel5.4构建了新项目,发现路由里多了api.php这个文件。
默认的代码是

Route::middleware('auth:api')->get('/user', function (Request $request) {
    return $request->user();
});

不知道auth:api是个什么东西,去看了一下。
才知道是配置了config/auth.php中的guardsapi项。而且这一项的默认配置的drivertoken
我想既然是默认配置,那肯定能用吧。
结果发现并不能。
网上找了好多资料才搞清楚逻辑,这种配置最终会在{project}/vendor/laravel/framework/src/Illuminate/Auth/TokenGuard.php 里执行,而实现的逻辑是通过api_token参数去user表找对应的数据,如果没有,就会报错。
然后默认的数据表里并没有api_token这个字段。
既然是默认配置,应该拿来就可以上手才对。搞不懂为什么Laravel默认用token这种driver,却没有把user表结构给添加上api_token这个字段?难道还有别的实现方式?或者是我搞错了?

回复
阅读 6.9k
7 个回答

auth:api必须要有api_token字段。没错。
不想的就自己扩展一个guard extension 出来

我是搜到这个问题的. 我想说一下, 因为我查了好几天.
csrf_token 跟 api_token 似乎不是一回事.
{{csrf_field()}}是在blade里面搞的.
题主说到的,我目前看到的是对的.
默认从request里拿到是'api_token'字段的值.
然后默认用一个EloquentUserProvider里面retrieveByCredentials构建一个查询.
就是查的这个string.
eloquent不去表里查还能去哪里查.
所以user表里面还就是得有一个api_token的字段.除非把guard里面的默认值改了.(那也得填个别的字段)

只有 @cevin 说的没错,但是也不清楚.

关于是不是默认配置,我理解是拿来就用的是web路由,你一个make:auth 什么都搞定了.
而且web guard是session的driver. 它的userprovider什么的都另外一套.
而api呢,你本来就是给别人的别的或者自己的别的应用用的,加一个就加一个.
规则得自己定么.而且只是简单的认证一下.
不是还有那么多工具来搞api认证.

StormerZ
  • 2.3k

api_token是一个加密字符串,在laravel中是可以设置这个api_token的时效的,不在user表中添加这个字段是因为这个字段是根据一定的条件动态加密出来的而不是固定不变的,这是一种安全机制

南北
  • 198

api_token并不是和数据库中字段对应的,如果你想使用的话,可以在页面的header头中传值图片描述过来

如果不想使用系统自带的验证方法,也可以自定义验证方式。然后自己写中间件验证操作

应用Laravel自带的apitoke认证,必须要在user表里面有api_token,字段,然后guard那里default设置成‘api,user’,然后写路由的时候用到middleware:auth组件。这个完全不需要第三方组件,Laravel本身就鞥搞定。

其实是可以换的,去tokenGuard 可以看到是两个类变量

宣传栏