Laravel Passport 客户端的 user_id 为 null
Posted
技术标签:
【中文标题】Laravel Passport 客户端的 user_id 为 null【英文标题】:Laravel Passport clients has user_id null 【发布时间】:2019-07-21 01:28:33 【问题描述】:我正在制作一个使用 laravel 护照后端从数据库获取和发布数据的反应应用程序。我可以完全控制应用程序代码和 laravel 后端代码。
我可以很好地制作访问令牌,无论是使用客户端,还是简单地通过发布用户来制作一个,但我不能使用此访问令牌来访问数据,如 here 所述。使用生成的访问令牌发送这样的请求每次都会给我一个 401。
我相信我的问题是在结交客户时。我有 2 个客户端(在运行 php artisan passport:install 时创建),但它们都有 user_id=null。我假设当用户使用客户端例如发出访问令牌时,这应该设置一些整数?但是,它没有。
那么,有没有人知道我做错了什么?
下面我发布了我的用户模型,以及迁移文件 users 和 oath_clients。如果需要,请随时索取更多代码!
用户模型:
class User extends Authenticatable
use HasApiTokens, Notifiable;
/**
* The attributes that are mass assignable.
*
* @var array
*/
protected $fillable = [
'name', 'email', 'api_token', 'redcap_token', 'password',
];
/**
* The attributes that should be hidden for arrays.
*
* @var array
*/
protected $hidden = [
'password', 'remember_token',
];
用户迁移:
class CreateUsersTable extends Migration
/**
* Run the migrations.
*
* @return void
*/
public function up()
Schema::create('users', function (Blueprint $table)
$table->increments('id');
$table->string('name');
$table->string('email')->unique();
$table->string('api_token', 60)->unique();
$table->string('password');
$table->rememberToken();
$table->timestamps();
);
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
Schema::dropIfExists('users');
Oauth 迁移
class CreateOauthClientsTable extends Migration
/**
* Run the migrations.
*
* @return void
*/
public function up()
Schema::create('oauth_clients', function (Blueprint $table)
$table->increments('id');
$table->integer('user_id')->index()->nullable();
$table->string('name');
$table->string('secret', 100);
$table->text('redirect');
$table->boolean('personal_access_client');
$table->boolean('password_client');
$table->boolean('revoked');
$table->timestamps();
);
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
Schema::dropIfExists('oauth_clients');
【问题讨论】:
【参考方案1】:在我看来,您需要参考用户 hasOne
OAuth 和 OAuth belongsTo
用户之间的关系。将此添加到您的 oauth_clients 迁移中:
$table->integer('user_id')->unsigned();
$table->foreign('user_id')->references('id')->on('user');
https://laravel.com/docs/5.7/migrations#foreign-key-constraints
然后在模型中包含必要的关系。希望这会有所帮助!
// User's Table
public function oauth()
return $this->hasOne(OAuth::class, 'user_id');
// OAuth Table
public function user()
return $this->belongsTo(User::class, 'user_id');
【讨论】:
这听起来正是我所希望的!如果您不介意,我有两个后续问题。 后续问题:Passport 让一切变得非常整洁,而且非常隐蔽,所以我什至不知道应该在哪里找到 Oath 课程。通过扩展,我不知道如何访问 OAuth 模型。对不起,如果我在这里很愚蠢,但我还是 Laravel/Passport 的新手,而且框架的流畅性让我非常困惑。【参考方案2】:这是 user_id 可以为 null 的 Qauth 迁移
$table->integer('user_id')->index()->nullable();
当您使用例如 uuid 添加客户端或将其设置为增量时,您要么传递此参数..
【讨论】:
啊哈。但这不应该与使用客户端的用户相关联,还是我误解了它的作用?以上是关于Laravel Passport 客户端的 user_id 为 null的主要内容,如果未能解决你的问题,请参考以下文章
官方 Laravel Passport 包中 Vue.js 组件中的 jQuery 代码
Encoding::UndefinedConversionError using Omniauth in Gitlab 13.5.3 with Laravel Passport - macOS 上的本
php Laravel Passport跳过授权客户的授权屏幕
带有 Laravel 5.4 后端的 Vuejs 2,发布(未经授权)错误