我在这篇文章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用户进行匹配。
有什么输入?处理多种身份验证服务的建议方法是什么?
答案 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)
...