如何使用身份验证在Firebase Java上运行JUnit测试?

时间:2016-10-01 08:29:16

标签: junit firebase spring-boot firebase-authentication

我目前正在移动应用中使用Firebase身份验证。后端是一个Spring启动应用程序。后端上的REST API依赖于从Firebase身份验证生成的令牌来检索用户的Firebase UID(verifyIDToken方法)以执行其他功能。 目前,我注意到在Firebase Java API(基于服务器)中,没有办法为用户生成令牌,因此我没有简单的方法在依赖用户身份验证的服务器上进行JUnit测试。任何人都有关于如何这样做的线索?

这是不起作用的示例代码:

@RequestMapping(value = "/api/subscribeChannel/{channelid}", method = RequestMethod.GET, produces = "application/json")
public DeferredResult<Object> subscribeChannel(@PathVariable Long channelid,@RequestHeader(value=FIREBASETOKEN, required = true) String idToken) {


    DeferredResult<Object> result = new DeferredResult<Object>(DEFERREDTIMEOUT);       

    // test it out with a locally generated token
    idToken = FirebaseAuth.getInstance().createCustomToken("valid Uid"); 

    Task<FirebaseToken> task = FirebaseAuth.getInstance().verifyIdToken(idToken)
            .addOnSuccessListener(new OnSuccessListener<FirebaseToken>() {
                @Override
                public void onSuccess(FirebaseToken decodedToken) {
                    String uid = decodedToken.getUid();                     
                    logger.info("Subscribe channel on success");

                        // do something

                        ret.setStatus("success");
                        ret.setMessage("channel id " + channelid + " subscribed");

                        result.setResult(ret);                          
                    } else {
                        result.setErrorResult(retStatus.getMessage());
                    }

                }
        }) .addOnFailureListener(new OnFailureListener() {

            @Override
            public void onFailure(Exception arg0) {
                Exception te = new TokenNotFoundException(idToken);
                logger.error("Token Not Found for " + idToken);
                result.setErrorResult(te);

            }

        });     

    return result;      

}  

2 个答案:

答案 0 :(得分:0)

您获得的自定义令牌与您用于登录的ID令牌不同。要从自定义令牌中获取ID令牌,请执行以下操作:

private static final String ID_TOOLKIT_URL =
	      "https://www.googleapis.com/identitytoolkit/v3/relyingparty/verifyCustomToken";
	  private static final JsonFactory jsonFactory = Utils.getDefaultJsonFactory();
	  private static final HttpTransport transport = Utils.getDefaultTransport();
    private static final String FIREBASE_API_KEY = "<your api key here>";

private String signInWithCustomToken(String customToken) throws IOException {
	    GenericUrl url = new GenericUrl(ID_TOOLKIT_URL + "?key="
	        + FIREBASE_API_KEY);
	    Map<String, Object> content = ImmutableMap.<String, Object>of(
	        "token", customToken, "returnSecureToken", true);
	    HttpRequest request = transport.createRequestFactory().buildPostRequest(url,
	        new JsonHttpContent(jsonFactory, content));
	    request.setParser(new JsonObjectParser(jsonFactory));
	    com.google.api.client.http.HttpResponse response = request.execute();
	    try {
	      GenericJson json = response.parseAs(GenericJson.class);
	      return json.get("idToken").toString();
	    } finally {
	      response.disconnect();
	    }
	  }

答案 1 :(得分:-1)

生成自定义令牌的Java API记录在Create custom tokens using the Firebase SDK

从那里:

String uid = "some-uid";
String customToken = FirebaseAuth.getInstance().createCustomToken(uid);