You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用Laravel Passport API检测设备类型(安卓、iOS、网页端)

Laravel Passport API 设备类型识别与存储实现方案

1. 新增数据表字段

首先为Passport的token表新增设备相关字段,执行命令生成迁移文件:
php artisan make:migration add_device_info_to_oauth_access_tokens_table
迁移文件内容示例:

public function up()
{
    Schema::table('oauth_access_tokens', function (Blueprint $table) {
        $table->string('device_type')->nullable()->comment('设备类型:android/ios/web/other');
        $table->text('user_agent')->nullable()->comment('完整请求UA');
        // 可选新增字段:设备唯一ID、设备名称等
        // $table->string('device_id')->nullable();
    });
}

执行迁移生效:
php artisan migrate

2. 绑定Passport token生成事件监听

Passport在access token生成完成后会触发AccessTokenCreated事件,通过监听该事件即可在token生成时自动写入设备信息。
首先在app/Providers/EventServiceProvider.php中注册事件监听关系:

protected $listen = [
    \Laravel\Passport\Events\AccessTokenCreated::class => [
        \App\Listeners\SaveDeviceInfoToAccessToken::class,
    ],
];

生成监听类:
php artisan make:listener SaveDeviceInfoToAccessToken
监听类实现逻辑:

namespace App\Listeners;

use Illuminate\Http\Request;
use Laravel\Passport\Events\AccessTokenCreated;
use Laravel\Passport\Token;

class SaveDeviceInfoToAccessToken
{
    protected Request $request;

    public function __construct(Request $request)
    {
        $this->request = $request;
    }

    public function handle(AccessTokenCreated $event)
    {
        $token = Token::find($event->tokenId);
        if (!$token) return;

        $token->update([
            'device_type' => $this->parseDeviceType(),
            'user_agent' => $this->request->userAgent(),
            // 可选:读取客户端传的设备唯一ID $token->device_id = $this->request->header('X-Device-Id');
        ]);
    }

    protected function parseDeviceType(): string
    {
        // 优先读取客户端自定义请求头,避免UA解析误差
        $customDeviceType = $this->request->header('X-Device-Type');
        if (in_array($customDeviceType, ['android', 'ios', 'web'])) {
            return $customDeviceType;
        }

        // UA解析兜底逻辑
        $userAgent = strtolower($this->request->userAgent() ?? '');
        if (str_contains($userAgent, 'android')) {
            return 'android';
        } elseif (str_contains($userAgent, 'iphone') || str_contains($userAgent, 'ipad')) {
            return 'ios';
        } elseif (str_contains($userAgent, 'mozilla') || str_contains($userAgent, 'safari') || str_contains($userAgent, 'chrome')) {
            return 'web';
        }
        return 'other';
    }
}

3. 特殊场景处理

  • 刷新token场景:如果需要在刷新token时同步更新设备信息,可额外监听Laravel\Passport\Events\RefreshTokenCreated事件,复用上面的解析逻辑即可
  • 多设备管理场景:如果需要单独维护用户设备列表,可单独创建user_devices数据表,关联用户ID、设备唯一标识、设备类型等信息,登录时新增或更新对应设备记录,更适合做设备挤下线、设备权限管控等需求

内容的提问来源于stack exchange,提问作者user17494635

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.25 07:15:04