【问题标题】:Token-based Authentication Laravel 5.5基于令牌的身份验证 Laravel 5.5
【发布时间】:2018-03-09 04:14:03
【问题描述】:

首先,Laravel 的身份验证配置为用户指定了基于令牌的身份验证方法:

'guards' => [
    'web' => [
        'driver'   => 'session',
        'provider' => 'users',
    ],

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

我有几个要保护的 ajax 端点,因此我的应用程序之外的任何人都无法与它们交互。我看过 Passport,但考虑到这个身份验证配置,我似乎实际上不需要它。 如何使用此令牌来保护我的 ajax 端点,并在可能的情况下识别请求所属的用户?

目前我的 api.php 路由文件看起来像:

//Route::middleware('auth:api')->group(function () {
    Route::post('subscribe', 'SubscriptionController@create');
    Route::post('unsubscribe', 'SubscriptionController@delete');
//});

我认为 Laravel 可能已经为 VueJS 实现处理了 auth 或其他东西,但它看起来不像。我的 ajax 请求如下所示:

this.$http.post('/api/subscribe', {
    subscribed_by: currentUser,
    game_id: this.gameId,
    guild_discord_id: this.guildDiscordId,
    channel_id: newChannelId,
    interests: this.interests.split(',')
}).then(response => {
    // success
}, response => {
    console.error('Failed to subscribe');
});

【问题讨论】:

  • 看看JWTAuth是否有帮助!!
  • 否则,您应该在用户表 api_token 中创建一个包含 60 个字符的随机值的列,然后您需要在您的调用中传递它 auth()->user()->api_token 并检查您是否收到数据库中的令牌。
  • 我打算将它用于 ajax 请求,因此静态令牌不起作用。

标签: laravel vue.js


【解决方案1】:

正如Maraboc 已经说过的,您应该首先在users 表中创建一个列api_token:$table->string('api_token', 60)->unique();

确保为每个新创建的用户分配一个令牌,并对其进行加密:$user->api_token = encrypt(str_random(60));

接下来,您可以在应用的页脚中定义一个 Javascript 变量:

window.Laravel = <?php echo json_encode([
    'apiToken' => !empty(Auth::user()) ? decrypt(Auth::user()->api_token) : ''
]); ?>;

稍后,当您想向端点发出请求时,您应该添加一个标头,授权用户:

let url = '/path/to/your-endpoint.json';
let data = {
    headers: {
        'Authorization': 'Bearer ' + Laravel.apiToken
    }
};

axios.get(url, data)
    .then(response => console.dir(response));

最后,在您的控制器中,您可以使用 Laravel 的 guard 获取您的 User 实例:

$user = !empty(Auth::guard('api')->user()) ? Auth::guard('api')->user() : null;

希望这会有所帮助!顺便说一句:这些文章帮助了我:

【讨论】:

    【解决方案2】:

    我采取的解决方案是不要将 ajax 端点放在 api 命名空间中。通过将它们设置为web 路由而不是api,它将使用 CSRF(跨站点请求伪造)保护来验证路由。因此,只有来自我的域才会对其进行身份验证。这仅在站点以 https 形式提供时才有用。

    【讨论】:

      猜你喜欢
      • 2023-04-10
      • 2016-09-21
      • 1970-01-01
      • 2021-01-25
      • 2016-01-23
      • 2016-01-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多