Google Cloud Endpoints 和用户身份验证

Posted

技术标签:

【中文标题】Google Cloud Endpoints 和用户身份验证【英文标题】:Google Cloud Endpoints and user's authentication 【发布时间】:2014-10-11 12:24:44 【问题描述】:

我目前是 AppEngine 领域的新手,并希望使用 Cloud Endpoints 为我正在开发的移动应用程序创建一个后端。

我现在的一个问题是关于用户的身份验证。我一直在关注 Udacity 在 App Engine 上的 MOOC,他们教我们如何使用 Google 帐户对 API 请求的用户进行身份验证。在后端,我们只需在我们的方法中添加一个User 参数,并检查用户是否已登录。据我所知,这个用户参数是由App Engine 生成的,基于Authorization 标头我们的要求。 (可能需要确认一下

现在,有一堆东西我不确定,而且在这个 MOOC 上也没有得到很好的解释。

现在,我想知道这是否与除 Google 之外的其他 OAuth 方案兼容?那么,如果我想实现 Facebook 身份验证,我是否只需传递 facebook 访问令牌?

根据我的搜索结果,在 android 上使用 Facebook SDK 可以让我生成一个用户访问令牌,它可以识别我的用户到 facebook。将它发送到我的后端后,我想用 Facebook 检查它的有效性,如果有效,就为我的应用程序创建一个新用户。现在,我还想生成一个新令牌,用于标识我的应用程序的用户。我需要做什么才能这样做?

【问题讨论】:

【参考方案1】:

您可以向 Endpoints 提供自己的身份验证器,注入的用户将与您的身份验证器一起获得 https://developers.google.com/appengine/docs/java/endpoints/javadoc/com/google/api/server/spi/config/Authenticator.html.

Facebook 凭据可以通过标头发送,例如授权头,可以通过HttpServletRequest从后端访问,可以在Authenticator.authenticate方法中处理。

例如。

// Custom Authenticator class
public class MyAuthenticator implements Authenticator 
  @Override
  public User authenticate(HttpServletRequest request) 
    String token = request.getHeader("Authorization");
    if (token != null) 
      String user = authenticateFacebook(token);  // apply your Facebook auth.
      if (user != null) 
        return new User(user);
      
    
    return null;
  


// Endpoints class.
@Api(name = "example", authenticators = MyAuthenticator.class)
public class MyEndpoints 
  public Container getThing(User user) 
    Container c = new Container();
    if (user != null) 
      c.email = user.getEmail();
    
    return c;
  

  public class Container 
    public String email;
    public String extraData;
  

【讨论】:

太棒了,看起来太棒了!我会尽快尝试的! 我目前正在尝试实现这一点。您是否知道 Cloud Endpoints 使用的默认身份验证器是什么?如果我仍然希望能够使用他的 Google 帐户对用户进行身份验证,我该如何访问默认的 Google 身份验证器? 默认身份验证器是 com.google.api.server.spi.auth.EndpointsAuthenticator。您可以将其添加到 @authenticators 列表的末尾,以在用户提供的身份验证器失败时将其作为后备。端点将尝试所有验证器并返回第一个成功的验证器。 非常感谢。 Cloud Endpoints 的强大功能。太糟糕了,现在没有足够的文档! @MinWan 我在此处描述的场景中提出了一个关于正确处理用户参数的单独问题:***.com/questions/28445840/…【参考方案2】:

当我尝试您的示例时,我总是得到一个:java.lang.NullPointerException: authDomain must be specified。但我无法在 User 对象上设置 authDomain。有什么想法吗?

更新:这与此错误https://code.google.com/p/googleappengine/issues/detail?id=12060&q=endpoints&colspec=ID%20Type%20Component%20Status%20Stars%20Summary%20Language%20Priority%20Owner%20Log有关

在 1.9.22 版本中

【讨论】:

以上是关于Google Cloud Endpoints 和用户身份验证的主要内容,如果未能解决你的问题,请参考以下文章

使用 Google Cloud Endpoints 时如何重启 Flask 服务器?

Google Cloud Endpoints 相当于 API 网关,还是 Endpoints 相当于微服务?

Google Cloud Endpoints:身份验证问题(错误 403)

如何在 Google Cloud Endpoints 中允许 CORS?

GWT 和 Google Cloud Endpoints

使用 Google Endpoints 在 Google Cloud Storage 上上传图片