首页 文章

Android Firebase Rest API身份验证

提问于
浏览
15

我目前正在使用Firebase Realtime数据库开发应用程序,但是我选择省略使用SDK从数据库中检索数据 . 原因是我不希望我的代码与FireBase紧密相关,因为一旦构建应用程序,api本身将转移到基于自定义休息的api .

我根据文档使用REST和Firebase实现了api调用,没有问题 - POST,GET,DELETE等 .

我遇到的问题是,如果我在数据库上启用任何类型的身份验证,根据我需要发送带有请求的文档"access_token",但我不知道从哪里检索它 . firebaseUser.getToken(true) 返回看起来是JWT令牌的内容,如果我将其作为 "access_token" 发送,则无法识别该令牌 . 我得到 401 Unauthorized

我还按照说明设置了一个服务帐户,该帐户似乎生成了一个有效的令牌,但它并没有唯一地标识用户 .

所以我的问题是,任何人都可以指出我如何获得所需的访问令牌,以识别哪个用户正在访问该API?我的Firebase项目支持的登录选项是Google,Facebook和Twitter .

2 回答

  • 7

    如果您要从每种不同的身份验证模式中查找不同的令牌或ID,则应为每个身份验证模式实现差异API:

    REST API

    要检索访问令牌,您需要使用服务帐户 . 请参阅使用Google服务帐户的指南 . 您可以从Firebase控制台的“服务帐户”部分在Firebase项目中创建服务帐户凭据 . 例如,生成适当的oauth2令牌的一种方法是使用Java google-api-client .

    GoogleCredential googleCred = GoogleCredential.fromStream(new FileInputStream("service_account.json"));
    GoogleCredential scoped = googleCred.createScoped(
        Arrays.asList(
          "https://www.googleapis.com/auth/firebase.database",
          "https://www.googleapis.com/auth/userinfo.email"
        )
    );
    scoped.refreshToken();
    String token = scoped.getAccessToken();
    

    成功的请求将由 200 OK HTTP状态代码指示 . 响应包含要检索的数据:

    { "first": "Jack", "last": "Sparrow" }
    

    Database REST API接受查询字符串 access_token=<TOKEN> 或 Headers Authorization: Bearer <TOKEN> 以使用服务帐户验证请求 .

    以下示例演示了如何在包含用户名的数据库中使用它 . 您可以使用Firebase项目的标识符替换 [PROJECT_ID] .

    Facebook

    您应该将 Facebook SDK 添加到您的应用程序并实现 LoginButtonLoginManager 项目,要求提供一些信息作为public_profile电子邮件 . 使用 Facebook SDK 非常烦人 . 有关如何添加它的示例代码如下:

    // Initialize Facebook Login button
    mCallbackManager = CallbackManager.Factory.create();
    LoginButton loginButton = (LoginButton) findViewById(R.id.button_facebook_login);
    loginButton.setReadPermissions("email", "public_profile");
    loginButton.registerCallback(mCallbackManager, new FacebookCallback<LoginResult>() {
        @Override
        public void onSuccess(LoginResult loginResult) {
            Log.d(TAG, "facebook:onSuccess:" + loginResult);
            handleFacebookAccessToken(loginResult.getAccessToken());
        }
    
        @Override
        public void onCancel() {
            Log.d(TAG, "facebook:onCancel");
            // ...
        }
    
        @Override
        public void onError(FacebookException error) {
            Log.d(TAG, "facebook:onError", error);
            // ...
        }
    });
    

    此外,在Facebook的developers console内,您应该创建一个帐户,使用您的应用程序包名称配置一个新项目,并为您的应用程序的调试和发布版本添加SHA键 . 完成所有这些操作后,您将使用 getAccessToken() 方法从 LoginResult 对象成功检索令牌

    您可以在official documentation中阅读更多相关信息 .

    谷歌

    谷歌更容易因为它已连接到Firebase,您应该添加到您的gradle google play services 并添加已经配置到您的应用程序的 google services JSON 文件 . 您可以从firebase控制台获取它 .

    在此之后,您需要使用JSON文件中的id配置 GoogleSignInOptions 项:

    // Configure Google Sign In
            GoogleSignInOptions gso = new GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN)
                    .requestIdToken(getString(R.string.default_web_client_id))
                    .requestEmail()
                    .build();
    

    在此之后,您只需要在应用程序中对 GoogleSignInApi 进行意图并等待 onActivityResult 回调:

    private void signIn() {
            Intent signInIntent = Auth.GoogleSignInApi.getSignInIntent(mGoogleApiClient);
            startActivityForResult(signInIntent, RC_SIGN_IN);
        }
    
        @Override
        public void onActivityResult(int requestCode, int resultCode, Intent data) {
            super.onActivityResult(requestCode, resultCode, data);
    
            // Result returned from launching the Intent from GoogleSignInApi.getSignInIntent(...);
            if (requestCode == RC_SIGN_IN) {
                GoogleSignInResult result = Auth.GoogleSignInApi.getSignInResultFromIntent(data);
                if (result.isSuccess()) {
                    // Google Sign In was successful, authenticate with Firebase
                    GoogleSignInAccount account = result.getSignInAccount();
                    firebaseAuthWithGoogle(account);
                } else {
                    // Google Sign In failed, update UI appropriately
                    // ...
                }
            }
        }
    

    在此之后,您将能够从GoogleSignInAccount项目中检索令牌 . 请记住为应用的调试或发布版本配置不同的SHA密钥,否则Google登录将停止在发布版本中运行 .

    你可以在official Firebase documentation中阅读更多相关信息 .

    推特

    关于twitter,我现在没有帮助你,但我建议你检查一下Twitter developer documentationfirebase Twitter implementation post .

    我将尝试编辑这个,当我在家里制作一些pocs检查它是如何工作的 .

    关于Firebase令牌

    了解Firebase id令牌的另一个好处是,每个用户和应用程序中的连接都是唯一的,允许您检查同一帐户是否尝试同时从不同设备登录,或发送 FCM cloud messages 以在线使用您的应用中的通知 .

    要检索它,您应该使用API和方法 FirebaseInstanceId.getInstance() 来使用 FirebaseInstanceId 对象 . 当用户登录您的应用时,这将为您的用户检索FirebaseInstance唯一ID .

    您可以使用 idInstance.getToken() 检索其令牌,并在应用程序中随时存储它以检查它并以您希望的方式进行管理 .

    Firebase documentation about this不是很清楚,所以我建议你使用下一个link,它帮助我在我的应用程序中实现它很多 .

    祝你好运,并有一个很好的编码,如果我能帮助你,请随时提出更多的问题!

  • 0

    您可以在服务器中为USER添加表 . 在该表中,添加firebase_token,google_token,fb_token等字段 . 当您逐个注册所有这些服务时,请更新表中的字段以供用户使用 . 通过这种方式,您可以维护users_info以及所有必需的令牌 .

相关问题