1

明天我将进行长途飞行,并且希望能够在离线状态下继续测试我的云端点REST API。问题是User对象是我的大多数方法不可或缺的部分,我需要互联网连接才能创建有效的OAuth令牌,以便从客户端(JavaScript)调用它们。离线测试经过身份验证的云端点方法

但是,在开发服务器上,无论您登录哪个帐户,用户始终都是相同的(使用电子邮件[email protected])。但是如果你喂它虚假标记,它会抛出一个OAuthRequestException

有没有什么办法可以为dev服务器离线生成有效的测试令牌?或者根本没有提供令牌的方式来访问User对象?

这是我想在脱机状态下进行测试的方法的例子:

@ApiMethod(name = "hylyts.get") 
public Hylyt getHylyt(@Named("url") String url, @Named("id") long id, User user) 
     throws OAuthRequestException, UnauthorizedException { 
    return ofy().load().type(Hylyt.class).parent(util.getArticleKey(url, user)).id(id).now(); 
} 

回答

2

有注入云端点的自定义Authenticator类一点点记录方式。这使您可以更改用户检测的方式。

下面是它如何工作的:

@Api(name = "myapi", version = "v1", authenticators = {MyDummyAuthenticator.class}) 
public class MyAPI { 
    @ApiMethod(name = "hylyts.get") 
    public Hylyt getHylyt(@Named("url") String url, @Named("id") long id, User user) 
     throws OAuthRequestException, UnauthorizedException { 
    return ofy().load().type(Hylyt.class).parent(util.getArticleKey(url, user)).id(id).now(); 
    } 
} 

而且这里是你的Authenticator实现可能是什么样子:

public class MyDummyAuthenticator implements Authenticator { 
    @Override 
    public User authenticate(HttpServletRequest httpServletRequest) { 
     return new User("[email protected]"); 
    } 
} 

当然,你可以使其更加复杂。由于您可以访问HttpServletRequest,因此您可以从HTTP标头或类似的东西获取用户的电子邮件。

注意与Authenticator您可以访问会话在本地服务器,但不是在生产中。在生产中,httpServletRequest.getSession()将返回null。这是一个技巧,仍然从数据存储中获取会话,which I explain here

然后是如何保持正常的身份验证解决方案和您的DummyAuthenticator实施的问题。我认为你可以链接认证者,但我不确定它是如何工作的。在最糟糕的情况下,您可以在航班期间更换Authenticator实施。

+0

这正是我所希望的。谢谢!回家测试它,然后接受飞往机场的高效飞行。 – willlma

+1

此方法唯一潜在的缺点是您必须使用com.google.api.server.spi.auth.common.User类而不是com.google.appengine.api.users.User,没有ID属性。请参阅[此错误](https://code.google.com/p/googleappengine/issues/detail?id=12060&q=endpoints&colspec=ID%20Type%20Component%20Status%20Stars%20Summary%20Language%20Priority%20Owner%20Log) 。但有利的是,我现在知道我将来如何处理非Google帐户。 – willlma

+0

请注意,您可以扩展'User'类并在其中添加任何您想要的内容。 – David

相关问题