如何更改令牌保护中的 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 列的主要内容,如果未能解决你的问题,请参考以下文章

如何将 jwt 令牌发送到 node.js 中的受保护路由

JSON Web 令牌(JWT)是如何保护 API 的?

如何保护 JavaScript API 访问令牌?

如何使用基于令牌的 HTTP 基本身份验证保护 MVC 4 .NET SPA 模板中的 WebAPI?

保护 oauth 不记名令牌免受 javascript 应用程序中的 XSS、CSRF 等攻击

如何仅为 ASP.NET 5 (ASP.NET Core) 中的受保护操作添加令牌验证