【问题标题】:Authenticating Android with firebase Authentication and send token to verify to backend Django使用 Firebase 身份验证对 Android 进行身份验证并将令牌发送到后端 Django 进行验证
【发布时间】:2019-08-31 10:03:38
【问题描述】:

我将在这里解决的问题是一个很常见的问题,我关心的是其中一个我将强调的部分:

我的 Android 应用使用 firebase 身份验证(创建或验证存在)对用户进行身份验证,然后在我的 django 后端调用各种 API。 要调用 API,我需要在每个请求中发送一个令牌,以防止未经授权的请求。

我计划首先使用 Django 身份验证,但由于我使用的是 firebase 身份验证,我正在考虑以下方法:

当用户登录或登录 Android 设备时。 Android 将生成一个自定义令牌(来自 firebase),将其存储在手机上,然后在每个 API 中将其发送到后端。 在后端,我将使用 firebase API(第一次)从 firebase 获取用户并将令牌存储在我的用户模型中。如果在我的数据库中找不到令牌并且在 firebase 中不可用,那么我会返回一个未经授权的用户。 对于后续请求,我使用本地用户表验证令牌。

请告知这种方法在这种情况下是否是最好的。

谢谢

【问题讨论】:

    标签: android django firebase firebase-authentication


    【解决方案1】:

    我无法评论您的方法。但即使我想知道最好的方法。这是我使用此页面中提供的信息的方法verify-id-tokens

    1. 用户使用 firebase sdk 登录。
    2. 我将令牌作为标头附加到改造 http 调用拦截器中。现在 id 令牌仅在 15-20 分钟内有效,因此您无法保存它们。只需使用以下代码在改造 http 调用中添加拦截器

      public class FirebaseUserIdTokenInterceptor implements Interceptor {
      
      // Custom header for passing ID token in request.
      private static final String X_FIREBASE_ID_TOKEN = "Authorization";
      
      @Override
      public Response intercept(@NonNull Chain chain) throws IOException {
          Request request = chain.request();
      
          try {
              FirebaseUser user = FirebaseAuth.getInstance().getCurrentUser();
              if (user == null) {
                  throw new Exception("User is not logged in.");
              } else {
                  Task<GetTokenResult> task = user.getIdToken(true);
                  GetTokenResult tokenResult = Tasks.await(task);
                  String idToken = tokenResult.getToken();
      
                  if (idToken == null) {
                      throw new Exception("idToken is null");
                  } else {
                      Request modifiedRequest = request.newBuilder()
                              .addHeader(X_FIREBASE_ID_TOKEN, "Bearer ".concat(idToken))
                              .build();
                      return chain.proceed(modifiedRequest);
                  }
              }
          } catch (Exception e) {
              throw new IOException(e.getMessage());
          }
      }
      

      }

    3. 我的节点服务器验证 id 令牌,如果 id 令牌有效则发送响应,否则会出现错误消息。

    检查页面上的警告:

    Firebase Admin SDK 中包含的 ID 令牌验证方法 旨在验证来自客户端 SDK 的 ID 令牌,而不是 您使用 Admin SDK 创建的自定义令牌。

    希望这会有所帮助!

    【讨论】:

      猜你喜欢
      • 2017-03-11
      • 1970-01-01
      • 2017-04-11
      • 1970-01-01
      • 2016-12-17
      • 1970-01-01
      • 2020-10-09
      • 2021-09-05
      • 1970-01-01
      相关资源
      最近更新 更多