Beim Implementieren einer benutzerdefinierten OAuth2-Gewährung wird der Fehler „unsupported_grant_type“ angezeigtPhp

PHP-Programmierer chatten hier
Guest
 Beim Implementieren einer benutzerdefinierten OAuth2-Gewährung wird der Fehler „unsupported_grant_type“ angezeigt

Post by Guest »

Ich versuche, einen benutzerdefinierten OAuth2-Gewährungstyp in Laravel Passport für die mobile Authentifizierung zu implementieren, erhalte jedoch den folgenden Fehler

Code: Select all

{
"error": "unsupported_grant_type",
"error_description": "The authorization grant type is not supported by the authorization server."
}
Hier ist die benutzerdefinierte MobileGrant-Klasse, die ich verwende:

Code: Select all

namespace App\Grants;

use App\Enums\UserType;
use Laravel\Passport\Bridge\UserRepository;
use Laravel\Passport\Bridge\RefreshTokenRepository;
use Laravel\Passport\Bridge\AccessToken;
use League\OAuth2\Server\Grant\AbstractGrant;
use League\OAuth2\Server\RequestTypes\AuthorizationRequest;
use League\OAuth2\Server\ResponseTypes\ResponseTypeInterface;
use Psr\Http\Message\ServerRequestInterface;
use DateInterval;
use App\Models\User;
use Carbon\Carbon;
use Illuminate\Support\Facades\Auth;

class MobileGrant extends AbstractGrant
{
public function __construct(UserRepository $userRepository, RefreshTokenRepository $refreshTokenRepository)
{
$this->setUserRepository($userRepository);
$this->setRefreshTokenRepository($refreshTokenRepository);
}

public function respondToAccessTokenRequest(
ServerRequestInterface $request,
ResponseTypeInterface $responseType,
DateInterval $accessTokenTTL
) {
$mobile = $this->getRequestParameter('mobile', $request);
$confirmCode = $this->getRequestParameter('mobile_confirm_code', $request);

if (!$mobile || !$confirmCode) {
return response()->json(['message' => 'Mobile number and confirmation code are required.'], 400);
}

$user = User::where('mobile', $mobile)->first();

if (User::where(['mobile' => $mobile, 'mobile_confirm_code' => $confirmCode])->exists() || $confirmCode == "1234") {
if (!self::isExpiredConfirmCode($user)) {
if (User::where(['mobile' => $mobile])->whereNull('mobile_verified_at')->exists()) {
User::where('mobile', $mobile)->update([
'mobile_verified_at' => Carbon::now()->format('Y-m-d H:i:s')
]);
}

Auth::login($user);
$role = UserType::hasValue($user->role) ? $user->role : null;

$accessToken = $this->issueAccessToken($accessTokenTTL, $user->id, $role);
$refreshToken = $this->issueRefreshToken($accessToken);

return [
'token_type' => 'Bearer',
'expires_in' => $accessTokenTTL->s,
'access_token' => (string) $accessToken,
'refresh_token' => (string) $refreshToken,
];
} else {
return response()->json(['message' => 'Confirmation code expired.'], 400);
}
} else {
return response()->json(['message' =>  'Invalid confirmation code.'], 400);
}
}

public function getIdentifier()
{
return 'mobile';
}

public function isExpiredConfirmCode($user)
{
return Carbon::parse($user->expire_mobile_confirm_code)->lt(Carbon::now());
}
}

In meinem AppServiceProvider aktiviere ich den benutzerdefinierten Gewährungstyp:

Code: Select all

public function boot(): void
{
app(AuthorizationServer::class)->enableGrantType(
new MobileGrant(
app()->make(\Laravel\Passport\Bridge\UserRepository::class),
app()->make(\Laravel\Passport\Bridge\RefreshTokenRepository::class)
),
new \DateInterval('P1Y') // Access token expiration time
);
}
Wenn ich jedoch versuche, das Token mit den folgenden Daten anzufordern:

Code: Select all

{
"grant_type": "mobile",
"client_id": "client-id-here",
"client_secret": "client-secret-here",
"mobile": "mobileNumber",
"mobile_confirm_code": "1234",
"scope": ""
}
Ich erhalte den Fehler „unsupported_grant_type“.
Kann mir jemand helfen herauszufinden, warum dieser Fehler auftritt und wie ich ihn beheben kann? Ich habe den benutzerdefinierten Gewährungstyp in AppServiceProvider aktiviert, aber er funktioniert immer noch nicht.
Vielen Dank im Voraus!
Bei der Implementierung von a wird der Fehler „unsupported_grant_type“ angezeigt benutzerdefinierte OAuth2-Gewährung in Laravel Passport.
Ich habe verschiedene Debugging-Versuche durchgeführt, kam aber zu keinem Ergebnis. Ich habe die Anfragedaten in mobileGrant protokolliert und die Daten wurden korrekt übermittelt.
Ich bin mir auch sicher, dass die Client-ID und die geheimen Informationen zum Client korrekt sind.

Code: Select all

 public function respondToAccessTokenRequest(
ServerRequestInterface $request,
ResponseTypeInterface $responseType,
DateInterval $accessTokenTTL
) {
dd($request);
}
In einigen Dokumenten wird erwähnt, dass Passport::routes() ebenfalls hinzugefügt werden sollte, aber in der neuesten Passport-Dokumentation heißt es, dass dies nicht notwendig ist.

Quick Reply

Change Text Case: 
   
  • Similar Topics
    Replies
    Views
    Last post