使用Sanctum和Firebase验证Laravel的API

jecbmhm3  于 2023-11-20  发布在  其他
关注(0)|答案(1)|浏览(95)

我正在使用Laravel创建一个API。
我还使用Firebase身份验证进行用户身份验证。
我想将Firebase身份验证颁发的“idToken”视为承载令牌。
我想和圣所确认一下
由于idToken用于承载令牌,因此不使用数据库。
但是,只有允许users表拥有令牌的示例。
我只想使用Firebase Authentication的verifyIdToken方法验证Bearer令牌。
我怎么能用圣所来处理这种案子
如果你能告诉我这件事,我将不胜感激。
P.S.我的母语不是英语,所以我为我糟糕的英语道歉。

mctunoxg

mctunoxg1#

这可能有点太晚了,但我留下了一个答案的人谁可能会偶然发现这一点,我面临着同样的情况,这里是我的解决办法:

步骤1.配置Firebase SDK:

确保你的Laravel项目中安装了Firebase Admin SDK。你可以通过Composer安装:

  1. composer require kreait/firebase-php

字符串

步骤2.创建Firebase认证中间件:

创建一个名为FirebaseAuthMiddleware的新中间件(或者您想叫它什么都行)

  1. php artisan make:middleware FirebaseAuthMiddleware

第三步:中间件编写

此中间件将使用之前安装的SDK提供的verifyIdToken方法

  1. // app/Http/Middleware/FirebaseAuthMiddleware.php
  2. namespace App\Http\Middleware;
  3. use Closure;
  4. use Kreait\Firebase\Auth;
  5. use Illuminate\Http\Request;
  6. class FirebaseAuthMiddleware
  7. {
  8. protected $firebaseAuth;
  9. public function __construct(Auth $firebaseAuth)
  10. {
  11. $this->firebaseAuth = $firebaseAuth;
  12. }
  13. public function handle(Request $request, Closure $next)
  14. {
  15. $token = $request->bearerToken();
  16. if (!$token) {
  17. return response()->json(['error' => 'Unauthorized'], 401);
  18. }
  19. try {
  20. $verifiedToken = $this->firebaseAuth->verifyIdToken($token);
  21. $request->attributes->add(['firebase_user' => $verifiedToken->getClaim('sub')]);
  22. } catch (\Exception $e) {
  23. return response()->json(['error' => 'Unauthorized'], 401);
  24. }
  25. return $next($request);
  26. }
  27. }

步骤4.注册中间件:

您需要在app/Http/Kernel.php中注册此中间件,如下所示:

  1. protected $routeMiddleware = [
  2. // ...
  3. 'firebase.auth' => \App\Http\Middleware\FirebaseAuthMiddleware::class,
  4. ];

第五步:使用新的中间件:

这就是firebase部分,现在你可以简单地在你的路由上使用这个中间件,就像你使用sanctum一样:

  1. Route::middleware(['firebase.auth', 'auth:sanctum'])->group(function () {
  2. // Your authenticated routes here
  3. });


上述实现完全取决于您的路由,您可以根据您的用例使用其中一个或两个。

后续步骤:

由于您没有使用任何传统的令牌数据库,因此需要sanctum来识别用户,为此,我们可以创建一个令牌存储库,以便sanctum正常运行,以下是它的工作原理:

使用Sanctum的Token Repository Contract创建自定义Token Repository:Laravel\Sanctum\Contracts\TokenRepository
AppServiceProvider中绑定您的自定义token仓库

  1. // app/Providers/AppServiceProvider.php
  2. use App\CustomTokenRepository;
  3. public function register()
  4. {
  5. $this->app->singleton(
  6. \Laravel\Sanctum\Contracts\TokenRepository::class,
  7. \App\FirebaseTokenRepository::class
  8. );
  9. }

上述步骤的实现:

如果你不明白上面的需要如何实现,请继续下面的操作。

Step 5.1:创建自定义Token仓库

首先,您需要创建一个自定义令牌存储库:app/FirebaseTokenRepository.php

  1. // app/CustomTokenRepository.php
  2. namespace App;
  3. use Illuminate\Database\Eloquent\Model;
  4. use Laravel\Sanctum\Contracts\TokenRepository as TokenRepositoryContract;
  5. use Laravel\Sanctum\PersonalAccessToken as SanctumPersonalAccessToken;
  6. class FirebaseTokenRepository implements TokenRepositoryContract
  7. {
  8. public function create($userId, $name, $token, $abilities)
  9. {
  10. return SanctumPersonalAccessToken::create([
  11. 'id' => $token->id,
  12. 'tokenable_id' => $userId,
  13. 'tokenable_type' => SanctumPersonalAccessToken::getUserModel(),
  14. 'name' => $name,
  15. 'token' => $token->plainTextToken,
  16. 'abilities' => $abilities,
  17. ]);
  18. }
  19. public function find($id)
  20. {
  21. return SanctumPersonalAccessToken::find($id);
  22. }
  23. public function findToken($token)
  24. {
  25. return SanctumPersonalAccessToken::where('token', hash('sha256', $token))->first();
  26. }
  27. public function update($token, $abilities)
  28. {
  29. // Update token abilities if needed
  30. $token->update(['abilities' => $abilities]);
  31. return $token;
  32. }
  33. public function delete($token)
  34. {
  35. $token->delete();
  36. }
  37. // You can implement additional methods as needed for your use case
  38. }


这就是它的令牌存储库是创建现在我们需要让我们的服务提供商知道使用这个并作出一些修改Sanctum的行为.

Step 5.2:绑定自定义Token仓库:

像这样更新AppServiceProvider.php

  1. // app/Providers/AppServiceProvider.php
  2. use App\FirebaseTokenRepository;
  3. use Laravel\Sanctum\Contracts\TokenRepository as TokenRepositoryContract;
  4. public function register()
  5. {
  6. //...
  7. $this->app->singleton(TokenRepositoryContract::class, FirebaseTokenRepository::class);
  8. }


这告诉Laravel在需要与TokenRepository合约交互时使用新创建的自定义(firebase)令牌仓库。

Step 5.3:更新配置(如果您使用的是SPA):

现在我们需要防止Sanctum使用Laravel的会话进行身份验证。为此,请确保您没有在API中间件中使用EnsureFrontendRequestsAreStateful中间件,并且在sanctum.php配置文件中更新stateful密钥:

  1. 'stateful' => explode(',', env('SANCTUM_STATEFUL_DOMAINS')),


致:

  1. 'stateful' => [''],


完成这一步后,我们就完成了,现在应用程序已经准备好与Firebase Authentication和Sanctum一起使用了。这个解决方案可能会根据laravel版本略有不同,任何类型的编辑都是受欢迎的。

  • 这是在Laravel 10上实现的,PHP 8.1Blade TemplatesReact NativeNextJs上进行了测试。对于任何类型的语法错误,我们深表歉意。
展开查看全部

相关问题