如何更改令牌保护中的 api_token 列
Posted
技术标签:
【中文标题】如何更改令牌保护中的 api_token 列【英文标题】:how to change api_token column in token guard 【发布时间】:2018-03-01 08:56:07 【问题描述】:Laravel 5.5
我想改变 TokenGaurd 中使用的 api 令牌的方向,所以, 我创建了一个名为 CafeTokenGaurd 的自定义守卫扩展了 TokenGuard,我在其中定义了 __construct 函数,就像我想要的那样:
public function __construct(UserProvider $provider, Request $request)
parent::__construct($provider, $request);
$this->inputKey = 'api_key'; // I want changing this part
$this->storageKey = 'api_key';
现在我想从与用户表的关系中定义api_key
,如下所示:
device_user table -> token
我想为用户拥有的每个设备定义特定的令牌,并且我想在用户和设备之间的数据透视表中为该列设置 api 键输入和存储键,
我该怎么做?!
谢谢
【问题讨论】:
我也有同样的问题。 :( 这个问题很复杂,如果你能简单地描述它会更好地帮助你.. @BasheerAhmedKharoti 更改令牌保护用于令牌存储密钥的列的名称 那么如果直接更改会发生什么?正如您已经提到的,您有自己的CafeTokenGuard
课程,那您为什么不在那里更改名称?
@BasheerAhmedKharoti 我可以将其更改为用户表中的另一列,我想将其更改为另一个表中的另一列而不是用户表
【参考方案1】:
自Laravel 5.7.28版本起,您可以在config/auth.php
中简单设置。
'guards' => [
'api' => [
'driver' => 'token',
'input_key' => 'token', // The input name to pass through
'storage_key' => 'token', // The column name to store in database
'provider' => 'users',
],
],
【讨论】:
非常感谢您的回答。 Laravel 文档没有提到这一点,这很糟糕 我面临同样的情况,我想将 api_token 从表 rb_konsumen 更改为 token_mobile 并按照您的指示进行操作,不幸的是它不起作用。这是我的后卫:php 'api' => [ 'driver' => 'token', 'input_key' => 'token_mobile', 'storage_key' => 'token_mobile', 'provider' => 'rb_konsumen', 'hash' => false, ],
【参考方案2】:
因为您需要更改从数据库中检索用户的方式,您实际上需要创建和使用自定义UserProvider
,而不是自定义Guard
。如果您想从 api_token
重命名输入键或存储键,则只需要自定义保护。
因此,您需要一个新的自定义 UserProvider
类,它知道如何使用给定的凭据(令牌)检索您的用户,并且您需要告诉 Auth
使用您的新自定义 UserProvider
类.
首先,假设您仍在使用 Eloquent,首先创建一个新的 UserProvider
类,该类扩展了基础 EloquentUserProvider
类。在此示例中,它是在 app/Services/Auth/MyEloquentUserProvider.php
创建的。在此类中,您将需要使用有关如何使用提供的令牌检索用户的详细信息来覆盖 retrieveByCredentials
函数。
namespace App\Services\Auth;
use Illuminate\Auth\EloquentUserProvider;
class MyEloquentUserProvider extends EloquentUserProvider
/**
* Retrieve a user by the given credentials.
*
* @param array $credentials
* @return \Illuminate\Contracts\Auth\Authenticatable|null
*/
public function retrieveByCredentials(array $credentials)
if (empty($credentials))
return;
// $credentials will be an array that looks like:
// [
// 'api_token' => 'token-value',
// ]
// $this->createModel() will give you a new instance of the class
// defined as the model in the auth config for your application.
// Your logic to find the user with the given token goes here.
// Return found user or null if not found.
创建课程后,您需要告知Auth
。您可以在AuthServiceProvider
服务提供商的boot()
方法中执行此操作。此示例将使用名称“myeloquent”,但您可以使用任何您想要的名称(“eloquent”和“database”除外)。
public function boot()
$this->registerPolicies();
Auth::provider('myeloquent', function($app, array $config)
return new \App\Services\Auth\MyEloquentUserProvider($app['hash'], $config['model']);
);
最后,您需要告诉Auth
使用您的新myeloquent
用户提供程序。这是在config/auth.php
配置文件中完成的。
'providers' => [
'users' => [
'driver' => 'myeloquent', // this is the provider name defined above
'model' => App\User::class,
],
],
您可以在documentation here 中阅读有关添加自定义用户提供程序的更多信息。
【讨论】:
所以在这个数组 ['api_token' => 'token-value', ] 我如何定义 $user->devices 实例?我的 api 令牌是设备和用户之间的枢纽这是我的问题 @Katerou22 这个想法是你有你的“代币价值”。现在您需要查找属于该令牌的用户。我不知道您的型号名称或关系,但您可能正在retrieveByCredentials()
方法中寻找类似的东西:$user = $this->createModel()->newQuery()->whereHas('devices', function ($query) use ($credentials) return $query->where('device_user.token', $credentials['api_token']); )->first();
从理论上讲,这将获取拥有具有匹配令牌的相关设备的用户。跨度>
你很棒你知道吗?! (我还没有测试过)
,你能检查一下吗? ***.com/questions/47843469/…@patricus以上是关于如何更改令牌保护中的 api_token 列的主要内容,如果未能解决你的问题,请参考以下文章
如何使用基于令牌的 HTTP 基本身份验证保护 MVC 4 .NET SPA 模板中的 WebAPI?