使用Firebase身份验证对Android进行身份验证,并发送令牌以验证后端Django

时间:2019-04-10 03:10:22

标签: android django firebase firebase-authentication

我在这里要解决的问题是很普遍的,我担心的是我要强调的一部分:

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

我最初计划使用Django身份验证,但是由于我使用的是Firebase Auth,因此我在考虑以下方法:

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

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

谢谢

1 个答案:

答案 0 :(得分:0)

我无法评论您的方法。但是,即使我也想知道最好的方法。这是我使用此页面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创建的自定义令牌。

希望这会有所帮助!