2017-09-02 97 views
0

我正尝试从GAE中的Channel API迁移到Firebase。要做到这一点,首先,我试图建立一个本地开发环境。我从GAE样本中克隆了示例应用程序。 (Link to sample从频道api迁移到firebase

当我运行这个时,当Web客户端尝试使用Firebase DB进行身份验证时,出现以下错误。错误在控制台中。

Screenshot of the error

即令牌认证failed.Clearly,这点到生成JWT是不正确的事实。

可以肯定的,我也做了以下内容:

  1. 创建于谷歌的云主机服务帐户。
  2. 下载的JSON,并指出这JSON在环境变量“GOOGLE_APPLICATION_CREDENTIALS”
  3. 将/从火力剪断成WEB-INF /视图的代码firebase_config.jspf文件
  4. 生成令牌的代码是作为(来自FirebaseChannel.java)如下

    public String createFirebaseToken(Game game, String userId) { 
    final AppIdentityService appIdentity = AppIdentityServiceFactory.getAppIdentityService(); 
    final BaseEncoding base64 = BaseEncoding.base64(); 
    
    String header = base64.encode("{\"typ\":\"JWT\",\"alg\":\"RS256\"}".getBytes()); 
    
    // Construct the claim 
    String channelKey = game.getChannelKey(userId); 
    String clientEmail = appIdentity.getServiceAccountName(); 
    System.out.println(clientEmail); 
    
    long epochTime = System.currentTimeMillis()/1000; 
    long expire = epochTime + 60 * 60; // an hour from now 
    
    Map<String, Object> claims = new HashMap<String, Object>(); 
    claims.put("iss", clientEmail); 
    claims.put("sub", clientEmail); 
    claims.put("aud", IDENTITY_ENDPOINT); 
    claims.put("uid", channelKey); 
    claims.put("iat", epochTime); 
    claims.put("exp", expire); 
    System.out.println(claims); 
    
    String payload = base64.encode(new Gson().toJson(claims).getBytes()); 
    String toSign = String.format("%s.%s", header, payload); 
    AppIdentityService.SigningResult result = 
    appIdentity.signForApp(toSign.getBytes()); 
    return String.format("%s.%s", toSign, 
    base64.encode(result.getSignature())); 
    } 
    

代替步骤#2,也已经尝试“gcloud AUTH应用缺省登录”,然后取消设置的环境变量之后运行 - 导致SAM e问题

感谢此方面的任何帮助。

回答

0

经过进一步研究,我发现了更多的信息,可以帮助其他人面临同样的问题。我做了以下操作以便能够在本地运行示例。

  1. 确保appengine中的服务帐户具有访问资源的权限非常重要。选择“编辑器”作为权限角色(其他级别也可以,但我选择了这种方式)默认的appengine服务帐户。这将确保您不会遇到“未经授权”错误。

  2. 我的应用程序已启用域身份验证,并且未使用Google身份验证。但是,该示例是为Google身份验证创建的。我不得不对示例代码进行更改,以将userId作为URL的一部分发送,并删除了引用UserServiceFactory的代码。

  3. 控制台错误甚至现在确实显示,但应用程序工作正常。这个错误可能可以忽略。但是,在部署的环境中,此错误不显示。

如果谷歌/火力地堡的工程师更新这个答案与官方的反应,或更新样本文件我将不胜感激适当作为当前这个信息似乎并没有在任何地方提到。