早些时候,我们的客户端应用程序使用Google登录。
现在,我们正在转向自定义身份验证,因为我们计划将用户的电话号码作为唯一的身份(而不是Google帐户)。但是在实施自定义身份验证器后,不会检查客户端 ID,我可以从任何地方进行 API 调用。
当客户端仅使用 Google 登录时,正在验证客户端 ID,并且我无法从授权客户端以外的任何客户端进行 API 调用。
如何在使用自定义身份验证器时验证客户端 ID?
API 终结点的代码
@Api(name = "apiSubscriber",
clientIds = {
Constants.webClientId,
Constants.androidClientId,
Constants.iOSClientId
},
authenticators = {com.google.api.server.spi.auth.EndpointsAuthenticator.class,
CustomAuth.class},
audiences = {Constants.androidAudience},
)
public class ApiSubscriber {
@ApiMethod
public Subscriber getSubscriberData(User user){
if(user!=null){
//fetches subscriber data
}
}
//... Other ApiMethods
}
自定义身份验证器的代码
public class CustomAuth implements Authenticator {
@Override
public User authenticate(HttpServletRequest request) {
String phoneNumber = request.getHeader("phoneNumber");
String token = request.getHeader("Authorization");
if(checkToken(phoneNumber,token)){
return new User(phoneNumber);
}
return null;
}
private boolean checkToken(String phoneNumber, String token){
//Checks if authorization token is valid
}
}
很遗憾,目前您似乎无法将端点 API 限制为客户端,而不能使用 Google 登录。
当使用Google的oAuth2身份验证时,会发生一些神奇的巫毒教(不确定是什么),并且应用程序仅限于您指定的ClientId。
但是,当您停止使用该身份验证方法时,我发现(令我非常失望的是),它不再起作用。
在此处查看我的问题,您可以在其中阅读有关我的测试以及一些可能为您提供更多信息的其他内容: 无需 Google 帐户登录即可向 Cloud Endpoint 验证客户端
我不确定这是否是一个问题,但是您提供的代码中有一些错误。
authenticators = {com.google.api.server.spi.auth.EndpointsAuthenticator.class,
CustomAuth.class,
而不是逗号必须是括号。另外,恕我直言,您只需要这里的自定义身份验证类。
audiences = {Constants.androidAudience},
逗号是多余的。
第二。您不需要使用自定义身份验证器。您可以将令牌和电话号码作为串联参数或两个参数发送到您的服务方法,并在那里进行检查。