私は正常に動作している Yii2 Filsh Oauth サーバーを使用していますが、ログインすると、デフォルトのフィールドで AccessToken が生成されます。
{
"access_token": "f3389e81c234276967079b2293795fc9104a2fac",
"expires_in": 86400,
"token_type": "Bearer",
"user_id": 9,
"scope": null,
"refresh_token": "851464a210f56bb831da378a43e1016bd3e765d7",
}
しかし、次のような応答にユーザー情報を追加する必要がありました
{
"access_token": "f3389e81c234276967079b2293795fc9104a2fac",
"expires_in": 86400,
"token_type": "Bearer",
"scope": null,
"refresh_token": "851464a210f56bb831da378a43e1016bd3e765d7",
"user": {
"id": 9,
"first_name": "Test",
"last_name": "Test2",
"username": "test",
"email": "test@gmail.com",
"status": 1,
"dob": "20-08-1990",
"gender": "Male",
}
}
私は自分の要件を満たすためにbshafferコアライブラリファイルをカスタマイズした奇妙な回避策を思いつきました(これは良いアプローチではありません)。私がしたことは、ユーザーモデルの次の行を変更しました:
return ['user_id' => $user->getId()];
これに
return ['user_id' => [$user->getId(), $userObject]]; //I get all user info in $userObject and passed an array with two fields
私は単一の代わりに配列を渡している$user->getId()
ので、このパスで利用可能なbshafferライブラリファイルAccessToken.phpを変更する必要がありました: vendor/bshaffer/oauth2-server-php/src/OAuth2/ResponseType/AccessToken.php
76行目
私はこれを変更しました:
public function createAccessToken($client_id, $user_id, $scope = null, $includeRefreshToken = true)
{
$token = array(
"access_token" => $this->generateAccessToken(),
"expires_in" => $this->config['access_lifetime'],
"token_type" => $this->config['token_type'],
"user_id" => $user_id,
"scope" => $scope
);
$this->tokenStorage->setAccessToken($token["access_token"], $client_id, $user_id, $this->config['access_lifetime'] ? time() + $this->config['access_lifetime'] : null, $scope);
if ($includeRefreshToken && $this->refreshStorage) {
$token["refresh_token"] = $this->generateRefreshToken();
$expires = 0;
if ($this->config['refresh_token_lifetime'] > 0) {
$expires = time() + $this->config['refresh_token_lifetime'];
}
$this->refreshStorage->setRefreshToken($token['refresh_token'], $client_id, $user_id, $expires, $scope);
}
return $token;
}
これに:
public function createAccessToken($client_id, $user_id, $scope = null, $includeRefreshToken = true)
{
$token = array(
"access_token" => $this->generateAccessToken(),
"expires_in" => $this->config['access_lifetime'],
"token_type" => $this->config['token_type'],
"scope" => $scope,
"user" => $user_id[1] //NOTE: I added new user field and passed second index of array which is user node
);
//NOTE: Here I passed $user_id[0] since $user_id is array hence I am using its 0 index here which has id
$this->tokenStorage->setAccessToken($token["access_token"], $client_id, $user_id[0], $this->config['access_lifetime'] ? time() + $this->config['access_lifetime'] : null, $scope);
if ($includeRefreshToken && $this->refreshStorage) {
$token["refresh_token"] = $this->generateRefreshToken();
$expires = 0;
if ($this->config['refresh_token_lifetime'] > 0) {
$expires = time() + $this->config['refresh_token_lifetime'];
}
//NOTE: Same goes here passing $user_id[0]
$this->refreshStorage->setRefreshToken($token['refresh_token'], $client_id, $user_id[0], $expires, $scope);
}
return $token;
}
問題は、 composerを実行したときに bshaffer コア ファイルを変更したため、デフォルトのコードが上書きされ、composer を実行した後に毎回同じファイルを変更する必要があることです。component
この calss/method をオーバーライドし、composer の実行後に同じように変更を加えた場合、適切な回避策が必要になる場合があります。