获取巨大的Firebase访问令牌

时间:2018-03-30 17:24:41

标签: java android firebase-authentication google-cloud-endpoints

我正在使用Firebase身份验证和Cloud Endpoints Frameworks。 在此背景下,我有两个问题属于一起:

在我的Android应用中,我按以下方式成功登录后请求访问令牌:

FirebaseUser user = mFirebaseAuthenticator.getCurrentUser();

user.getIdToken(true).addOnCompleteListener(new OnCompleteListener<GetTokenResult>() {
public void onComplete(@NonNull Task<GetTokenResult> task) {
    if (task.isSuccessful()) {
      mIDToken = task.getResult().getToken();
      Log.d("attempLogin", "GetTokenResult result = " + mIDToken);
    } else {
      Log.d("attempLogin", "Cannot get token = " + task.getException());
    }
  }
 });

然后我将收到的访问令牌传递给自动生成的 端点框架客户端API方法 allOrdersRequest(...)

OrderCollection orders = allOrdersRequest.setOauthToken(mIDToken).execute();

执行有效且授权的后端API调用。

第一个问题: 收到的访问令牌大约有800个字符,在我看来 相对太多了。它几乎是1kb,必须与每个后端API方法请求一起发送。我的假设是正确的,还是应该(甚至可以)改变Firebase控制台中的访问令牌大小?

第二个问题: 是否是将收到的令牌传递给端点框架客户端API的 setOauthToken()方法以执行授权的API请求的正确方法,或者每次都必须操纵 allOrdersRequest的httpheader ()

1 个答案:

答案 0 :(得分:1)

我找到了授权云端点API请求的正确方法:

使用我生成的云终端客户端 API请求中的方法 setOauthToken()(在此示例中,方法 allOrdersRequest()为后端api方法)是错误的方法。 相反,有必要指定&#34;授权&#34;典型承载的http标头字段,并在REST API请求(端点客户端API)中为其分配请求的Firebase访问令牌(idToken)

以下是一个例子:

//启动云端点客户端API构建器 Endpoint.Builder endpoint = new Endpoint.Builder(AndroidHttp.newCompatibleTransport(),new GsonFactory(),null);         endpoint.setRootUrl(&#34; https://my_project_id.appspot.com/_ah/api/&#34);         endpoint.setApplicationName(&#34; my_project_id&#34);

    Endpoint service = endpoint.build();
    HttpHeaders authorizationHeader = new HttpHeaders();
    authorizationHeader.setAuthorization("Bearer " + mAccessToken);

    // Model instance
    OrderRequest orderRequest = new OrderRequest();
    orderRequest.setBagId(35);
    orderRequest.setPriority(9);

    orderRequest.setCustomer("foo@bar.com");
    try {
        Endpoint.ProcesOrderRequest request = service.procesOrderRequest(orderRequest);
        request.setRequestHeaders(authorizationHeader);
        Order order = request.execute();
        Log.d("ExecuteAPIRequest", "OrderId result = " + order.getOrderId());
    } catch (IOException ex) {
        System.out.println("Exception caught: " + ex.getMessage());
    }