如何使用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
相关产品推荐
相关产品推荐

