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

相關問題