2013-10-01 68 views
12

我的應用使用Oauthed Cloud Endpoints並且在生產環境中正常工作。如何使用Oauth在devserver上測試雲端點

我的問題是,在本地devserver,我的用戶的用戶總是被設置爲[email protected],即使我已經通過正常的身份驗證,訪問代碼,等等等等走了,有一個有效的authed用戶。

我得到那個[email protected]對於oauth工作正常之前測試oauth端點是有用的,但是由於我的應用程序正在工作,我寧願在那裏看到實際的用戶。

具體而言,我的終點的方法是

@ApiMethod(name = "insertEmp"), etc 
public Emp insertEmp(User user, Emp emp) { 
     System.out.println(user.getEmail()); // (A) log "appengine" email 
     System.out.println(OAuthServiceFactory.getOAuthService().getCurrentUser().getEmail(); // (B) log authed email 

     ... 

在部署時,一切都很好,都(A)和(B)的登錄身份驗證的用戶([email protected])。 (A)總是記錄「[email protected]」,儘管我已經通過Oauth序列並且擁有有效的,經過身份驗證的用戶,並且(B)記錄了my.email @ gmail.com。因此,我可以進行高保真度測試,我需要用戶成爲真正的身份驗證用戶。

因此,簡單地說,我如何得到(A)和(B)是相同的?

回答

3

似乎也不能這樣做。通過將以下代碼放在我的端點方法的頂部,我已經結束了編碼。

if ("[email protected]".equalsIgnoreCase(user.getEmail()) { 
    user = new User(OAuthServiceFactory.getOAuthService().getCurrentUser().getEmail(),"foo"); 
} 

因此,現在即使在devserver上,用戶電子郵件也與Oauth電子郵件相匹配。

+3

不適用於我...使用appengine 1.9.3和電子郵件繼續相同:[email protected] –

+1

你仍然能夠得到真正的電子郵件?我得到null作爲用戶,如果我調用OAuthServiceFactory.getOa ..()。getCurrentUser()我得到[email protected] – Patrick

+0

同樣在這裏。我爲端點返回的用戶以及OAuthServiceFactory.getOAuthService()獲取了[email protected]。getCurrentUser() – Patrick

1

這並不容易。您必須在API控制檯中進行設置。在這裏,您將能夠添加「本地主機」(http://localhost/)然後,您可以通過Google進行身份驗證,即使您在本地主機上運行應用程序以進行開發。 我已經廣泛使用它,它工作正常 鏈接:https://code.google.com/apis/console/ 只要記住你在這裏使用的ID是完全獨立於你的appengine ID。 花了我幾個小時找出一個。

+2

謝謝,但這不是我問題的答案。我已經過去了將本地服務器配置到API控制檯的問題,並且Oauth *正在工作。我的問題是,即使Oauth正在工作,Cloud Endpoints也會忽略它並將[email protected]替換爲已通過身份驗證的用戶 – pinoyyid

+1

@pinoyyid:Google正在其文檔中討論此問題「重要提示:如果後端API受Auth保護,您的客戶端必須提供支持,如上面在使用OAuth 2.0添加驗證支持下所述,但在針對本地開發服務器運行時,不會顯示憑據頁面來響應用戶的登錄嘗試,而只會出現登錄,授予用戶訪問受保護的API以及返回的用戶始終是[email protected]「,地址爲https://cloud.google.com/appengine/docs/java/endpoints/consume_android#making_authenticated_calls – maya

0

問題是,當你在本地進行身份驗證時,你沒有通過Google服務器進行身份驗證,因此對用戶進行身份驗證實際上不是在本地進行的。

當您嘗試模擬登錄時,Google總是提供[email protected]用戶,它基本上發生在所有服務中,例如您在任何網站通過Google帳戶提供登錄(例如,使用GWT和App Engine)。

如果您與您的真實用戶一起測試或者您認爲[email protected]用戶爲您的用戶,那麼您的網站可能會有什麼不同?

+1

但是... I **我**通過谷歌服務器。如果我從我的servlet調用oauth端點,我得到了真正的,經過認證的谷歌用戶。問題在於devserver中的appengine/endpoint代碼忽略了它。我無法進行音響測試,因爲我想測試從未知用戶接收用戶的入門過程,以及具有能夠訪問Google API的存儲憑證的入門過程。這是受阻的,因爲我的CE端點類不是真正的用戶,而是用假用戶呈現。 – pinoyyid

+0

我已更新該問題以更詳細地說明差異。 – pinoyyid

0

在您的端點API,你需要這個

ApiMethod (name="YourEndPointName", path="yourPath", 
      clientIds={"YourId.apps.googleusercontent.com"}, 
        scopes = { "https://www.googleapis.com/auth/userinfo.profile" }) 

然後在調用的方法,你將不得不從GAPI用戶對象。 使用它從谷歌的用戶對象獲得實際的電子郵件這樣

public myEndPointMethod(Foo foo, User user){ 
    email = user.getEmail(); 
} 
+0

請閱讀該問題。我已經有了!問題是user.getEmail()返回的值。 – pinoyyid

+0

此外,範圍應該在https://developers.google.com/+/api/oauth#profile中聲明爲「email」,因爲userionfo.profile不包含用戶的電子郵件,因此用戶參數將爲空。 +您提到的範圍已被棄用。 – Pega88

+0

什麼是'YourId'?我有myapp-xxxx.appspot.com - 我覺得我正在接近,但有點卡住 –

0

我替換了Oauth2用戶(example @ example。com)與UserFactory的用戶,它工作正常。我使用這種方法來驗證所有API認證的API請求的用戶。

public static User isAuthenticated(User user) throws OAuthRequestException{ 

    if(user == null){ 
     throw new OAuthRequestException("Please login before making requests"); 
    } 
    if(SystemProperty.environment.value() == 
      SystemProperty.Environment.Value.Development && "[email protected]".equalsIgnoreCase(user.getEmail())) { 

     //Replace the user from the user factory here. 
     user = UserServiceFactory.getUserService().getCurrentUser(); 

    } 
    return user; 

} 
+0

這不起作用。我從UserServiceFactory.getUserService()獲取null。getCurrentUser()和OAuthServiceFactory.getUserService()獲取[email protected] – Patrick

-1

這是不可能的。 我使用另一個端點替換當前會話中的user_id。

0

使用Go運行時我都使出這一功能以獲得一個用戶,既開發服務器和生產上的功能:

func currentUser(c context.Context) *user.User { 
    const scope = "https://www.googleapis.com/auth/userinfo.email" 
    const devClient = "123456789.apps.googleusercontent.com" 

    allowedClients := map[string]bool{ 
     "client-id-here.apps.googleusercontent.com": true, 
     devClient: true,    // dev server 
    } 

    usr, err := user.CurrentOAuth(c, scope) 
    if err != nil { 
     log.Printf("Warning: Could not get current user: %s", err) 
     return nil 
    } 

    if !allowedClients[usr.ClientID] { 
     log.Printf("Warning: Unauthorized client connecting with the server: %s", usr.ClientID) 
     return nil 
    } 

    if (usr.ClientID == devClient) { 
     usr = user.Current(c)   // replace with a more interesting user for dev server 
    } 
    return usr 
} 

這將使用開發服務器的登錄信息輸入使用http://localhost:8080/_ah/login

相關問題