【问题标题】:Getting huge Firebase access token获取巨大的 Firebase 访问令牌
【发布时间】:2018-09-09 17:54:36
【问题描述】:

我将 Firebase 身份验证与 Cloud Endpoints 框架结合使用。 在这种情况下,我有两个问题属于同一类:

在我的 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 个字符,在我看来 相对过多。每个后端 API 方法请求都必须发送几乎 1kb。我的假设是否正确,或者应该(甚至可以)更改 Firebase 控制台中的访问令牌大小?

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

【问题讨论】:

  • @all 没人知道吗?我敢肯定,我不是 firebase 身份验证和云端点框架客户端的唯一用户......非常感谢任何帮助。

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


【解决方案1】:

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

使用我生成的云端点之一 client API 请求中的方法 setOauthToken() (在本例中,方法 allOrdersRequest() 是后端 api 方法)是错误的方法。 相反,需要指定 typ bearer 的“Authorization”http 标头字段,并在 REST API 请求(端点客户端 API)中为其分配请求的 Firebase 访问令牌(idToken)

这是一个例子:

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

    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());
    }

【讨论】:

  • NB IdToken 与 AccessToken 不同。 AccessToken 要小得多。你应该发送它。
猜你喜欢
  • 2018-09-30
  • 2019-12-05
  • 2018-02-17
  • 2014-07-09
  • 2017-11-10
  • 2018-11-07
相关资源
最近更新 更多