如何将自定义信息从App Engine身份验证器传递到端点?

时间:2015-02-11 03:00:34

标签: google-app-engine authentication google-oauth google-cloud-endpoints facebook-authentication

我在这篇文章Google Cloud Endpoints and user's authentication中引用了@MinWan的精彩答案,在那里他描述了一种向针对App Engine的Cloud Endpoints的请求添加自定义标头的方法。

很明显,我们可以为每个服务(例如Google,Twitter,Facebook)添加自定义标头并编写验证器,我们要对其进行身份验证,其中每个身份验证器读取特定标头并对服务进行身份验证。如果令牌有效,服务通常会返回带有电子邮件地址或用户ID的响应,以及一些额外信息[A],我们会从中生成com.google.api.server.spi.auth.common.User,稍后以com.google.appengine.api.users.User。

的形式传递到端点方法

第一个问题:为什么我们有两个不同的用户实体,例如具有不同命名空间的用户?看起来,它们既不是子类/超类,所以它们可能在幕后明确地投射。

第二个问题:显式转换的User实体带来的问题,并且没有自定义字段,我可以放置服务返回的额外信息[A],这是额外的信息丢失。这些额外信息可能有助于将外部服务的oauth2用户与本地用户或其他服务返回的oauth2用户进行匹配。

有什么输入?处理多种身份验证服务的建议方法是什么?

2 个答案:

答案 0 :(得分:6)

刚刚测试过,您肯定可以将User子类化为包含您想要的任何私有字段。只需使用类继承多态就可以从Authenticator方法返回该类型的对象,而无需在方法签名中更改默认User的类型。

import javax.servlet.http.HttpServletRequest;
import com.google.api.server.spi.auth.common.User;
import com.google.api.server.spi.config.Authenticator;

public class BazUser extends User {
        private String secret; // extra piece of data held by this User
        public BazUser(String email) {
                super(email);
                this.secret = "notasecret";
        }
        public BazUser (String email, String secret) {
                super (email);
                this.secret = secret;
        }
}

public class BazAuthenticator implements Authenticator {
        public User authenticate(HttpServletRequest req) {
                return new BazUser ("userid@baz.com", "secret");
        }
}

答案 1 :(得分:1)

从功能上讲,一切都适用于:

import com.google.api.server.spi.auth.common.User;

即使是gradle:

compile 'com.google.endpoints:endpoints-framework:2.0.0-beta.11'

可以通过包含@SuppressWarnings("ResourceParameter")来清除IDE警告,如下所示:

/**
 * Adds a new PmpUser.
 *
 * @param pmpUser  pmpUser object
 */
@SuppressWarnings("ResourceParameter")
@ApiMethod(
        name = "pmpUser.post",
        path = "pmpUser",
        httpMethod = ApiMethod.HttpMethod.POST)
...