我正在使用我的自定义身份验证流程(使用脸谱验证),并希望完全禁用Google Cloud Endpoints提供的身份验证。
当我使用HTTP Authorization标头(Bearer)设置它时,它会自动调用一些框架方法,它会在日志中显示以下条目 -
D 2015-03-21 20:41:22.622 Checking for id_token.
D 2015-03-21 20:41:22.622 id_token verification failed: Token is not an id_token (Wrong number of segments)
D 2015-03-21 20:41:22.623 Checking for oauth token.
D 2015-03-21 20:41:22.627 Oauth framework user didn't match oauth token user.
我认为它每次调用google apis并检查oauth令牌。
我尝试设置auth_level=endpoints.AUTH_LEVEL.REQUIRED
,但警告仍在那里。
最后,我通过源代码对此进行了调试,并将env变量ENDPOINTS_USE_OAUTH_SCOPE
设置为某个随机值,以防止它使用google api进行检查。
有没有更好的方法来解决这个问题?
[编辑]这适用于AppEngine Python。
答案 0 :(得分:1)
根据@tomrozb的要求,这是我们今天使用的一个非常简单的实现。真的不是很多。
首先,我们的AngularJS前端将标头令牌附加到每个请求,此标记在登录(非经过身份验证的端点)上获取并存储在本地(非常类似于cookie)。确保使用HTTPS!
在我的端点上,我只需使用req.getHeader("Authorization");
检查该令牌,并检查该令牌是否符合我当前的"会话"并抛出UnauthorizedException("Not logged in")
例外。请记住,如果请求,将自动注入原始HTTPServletRequest,以便您可以执行以下操作:
@ApiMethod(name="createWhatever", path="createWhatever")
public Whatever createWhatever(CreateWhateverRequest data, HttpServletRequest req) throws UnauthorizedException{
Long userId = getUserId(req.getHeader("Authorization"));
if(userId == null){
throw new UnauthorizedException("Not logged in");
}
//do your thing
}
这基本上就是内置功能所做的,它注入了一个"用户"您的请求上的对象,并要求您检查其是否为null并采取相应的行动,我只针对自定义实体而不是OAuth的任何GAE凭据存储。