当前位置: 首页 > 知识库问答 >
问题:

将现有项目迁移到Firebase:身份验证处理

厉念
2023-03-14

我有一个现有的项目是建立在:

  • AngularJS

我正在重写前端,将其移动到Angular 8,我想利用firebase的功能。

我目前正在集成身份验证功能(用户名/密码、谷歌、twitter、facebook等)

我在考虑我的下一步:

  • 一旦我的使用通过firebase验证,我的GAE PHP后端如何检查用户是否通过了验证

我在想象这样的事情:

  • 一旦通过firebase验证,使用OAuth2令牌调用我的GAE后端
  • 调用一些神奇的函数来验证OAuth2令牌,并将firebase用户与我的内部用户表关联起来
  • 用JWT回复
  • 在每个调用中包括JWT和OAuth2令牌

这样行吗?有什么建议吗?

共有1个答案

翟缪文
2023-03-14

我是这样做的:

在客户端(Angular应用程序),我使用ngx auth firebaseui来显示登录表单。

在表单上,我设置了处理身份验证成功的回调:

login.component.html

<ngx-auth-firebaseui (onSuccess)="successfulLogin($event)"
                     (onError)="printError($event)">
</ngx-auth-firebaseui>

回调的代码在这里。从Firebase User对象中,我调用方法getIdTokenResult()来获取Firebase JWT。然后我通过身份验证服务调用我的PHP后端

login.component.ts

successfulLogin(user:User) {

    console.log(user);
    user.getIdTokenResult().then((idTokenResult:IdTokenResult)=> {
      console.log(idTokenResult.token);

      let token : string = idTokenResult.token;
      let rcqJWTToken = this.authenticationService.authenticate( { token } as FirebaseJWT);


      rcqJWTToken.subscribe((rcqToken:string)=> console.log("RCQ JWT Token : '"+rcqToken+"'"));

      this.router.navigate['/welcome'];
    });    
}

在这里,我将Firebase JWT传输到我的php后端身份验证。服务ts

  authenticate(firebaseJWTToken:FirebaseJWT):Observable<String>{

    return this.http.post<String>(this.authenticationURL, firebaseJWTToken, httpOptions)
    .pipe(
      tap(_ => console.log('fetched RCQ JWT')),
      catchError(this.handleError<String>('authenticate', ""))
    );
  }

在服务器端:

我将GOOGLE_应用程序_凭据设置为env var,就像部署在GOOGLE App Engine上一样

putenv(“GOOGLE_应用程序_凭证=/Users/myuser/.cred/GCP-project-ID.json”)

我使用Slimframework,所以我在依赖项中实例化Firebase对象。php文件。使用env var,Firebase不需要其他任何东西。点击这里:https://firebase-php.readthedocs.io/en/4.32.0/setup.html


use Kreait\Firebase;
use Kreait\Firebase\Factory;

/**
 * Used to authenticate a firebase user, from it's Firebase JWT
 * @property Firebase $firebase
 * @param    \Slim\Container $c
 * @return   Firebase
 */
$container['firebase'] = function (\Slim\Container $c)
{
  $firebase = (new Factory)->create();
  return $firebase;
};

下面是进行身份验证的路径:

$app->post(getPrefix().'/firebase-authenticate', function($request, $response, $args) use ($app)
{
  $token    = $this->clientInputValidator->validateString("token"   , $request->getParsedBodyParam("token"    ), 1500 , true );
  $username = "";
  Logger::dataForLogging(new LoggingEntity(null,  ["username"=>$username]));

  try
  {
    $verifiedIdToken = $this->firebase->getAuth()->verifyIdToken($token);
  }
  catch (InvalidToken $e)
  {
    $response401 = $response->withStatus(401);
    $response401->getBody()->write(json_encode(["error" =>"Authentication error"]));

    $this->logger->error("Firebase authentication error", array('username' => $username, 'token' => $token));

    return $response401;
  }
  $uid  = $verifiedIdToken->getClaim('sub');
  $user = $this->firebase->getAuth()->getUser($uid);


  $this->logger->debug("Firebase JWT checked successfully", array('uid' => $uid,'user' => $user));
});

主要内容如下:$verifiedToken=$this-

用户详细信息可在此处检索:

$user=$this-

我可以在Firebase JWT中获取uid、电子邮件和所有信息。

令牌本身的TTL为1小时,因此我可能必须刷新令牌并在后端重新验证它。

 类似资料:
  • 我有一个基于Java/Spring的web应用程序,它使用Oracle11g。当前,用户在登录时直接通过用户名/密码对系统表进行身份验证。 这不得不改变,所以我们创建了一个(常规的)新表,在那里存储所有的用户数据。我们将所有现有密码插入到新创建的表中。然而,密码似乎是以本站点描述的方式加密/散列的 我使用了ora_hash和dbms_obfuscation_toolkit.desdecrypt,但

  • 我正在尝试将wildfly身份验证迁移到elytron,并且除了一个问题之外,几乎所有内容都可以按照我想要的方式工作。 我们正在使用quartz调度程序运行作业。这些作业不受调用方原则的约束。使用 我能够将原则传播到以下EJB调用。这不再有效,原则始终是“匿名”。有没有一种方法可以对Elytron做同样的事情?

  • 使用validation验证器 仓库地址: validation 安装 composer require illuminate/validation 我们先单例validation验证器 namespace App\Vendor\Validators; use Illuminate\Validation\Factory; class Validator extends Factory {

  • 我一直很难找到Google Firebase身份验证背后的SLA。根据托管和实时数据库的服务水平协议,Firebase的每月正常运行时间百分比应至少达到99.95%。它是否适用于身份验证服务?

  • Github : ThinkValidate - 从ThinkPHP5.1独立出来的验证器类库 安装 composer require topthink/think-validate 直接在控制器中使用 验证器没有额外的配置文件,可以直接现场定义规则,对数据进行验证,用法与ThinkPHP的控制器验证是一致的 use thinkValidate; $validate = Validate::mak

  • 我正在尝试将Web应用程序从WebSphere 8.5.5迁移到Liberty16.0.0.3。在WebSphere中,我曾经定义了一些J2C安全条目,然后以编程方式加载这些条目。我如何在Liberty中实现这一点? 我尝试在服务器中定义一个“authData”条目。xml,然后通过AuthDataProvider加载它。getAuthData(),但这需要“passwordUtilities-1