12

我想將谷歌分析圖形合併到Web應用程序以顯示其應用程序用法的用戶統計信息。這是當地的網址http://192.168.100.10:9000/我登錄到儀表板(網絡應用程序)我有一個谷歌登錄按鈕。到目前爲止,在這裏我保持用戶登錄後的會話。播放框架。在谷歌重定向後會話變爲空登錄頁面

並且當用戶點擊登錄按鈕時。它觸發回調方法。當第一次觸發回調時,它會保持會話。我的意思是session("user")在這裏不是null。

public Result callback() { 
    JsonNode jsonNode = Json.parse(session("user")); 
    UserDTO userDTO = Json.fromJson(jsonNode, UserDTO.class); 

    if (userDTO.getRole().getType().equals(RoleDTO.EnRoleType.ADMIN.toString())) 
     return redirect(com.softoven.ultron.controllers.routes.AccountCTRL.index()); 
    if (request().queryString().get("code") != null && request().queryString().get("state") != null && request().queryString().get("state")[0].equals(session("state"))) { // Check if he/she is authorized 
     session().remove("state"); 
     Analytics analytics = setAnalytics(userDTO, request()); 
     session("analytics", Json.toJson(analytics).toString()); 
     return redirect(com.softoven.ultron.controllers.routes.AccountCTRL.index()); 
    } else { // Create Authorization URL 
     String url = helper.buildLoginUrl(); 
     session("state", helper.getStateToken()); 
     return redirect(url); 
    } 
} 

這是URL,當用戶點擊登錄按鈕 https://accounts.google.com/o/oauth2/auth?access_type=offline&approval_prompt=force&client_id=784122128025-cvq0fn1e23f24dia4soavsd9v1ovesub.apps.googleusercontent.com&redirect_uri=http://localhost:9000/callback&response_type=code&scope=https://www.googleapis.com/auth/analytics.readonly%20https://www.googleapis.com/auth/analytics.manage.users%20https://www.googleapis.com/auth/analytics%20https://www.googleapis.com/auth/analytics.edit%20https://www.googleapis.com/auth/analytics.manage.users.readonly%20https://www.googleapis.com/auth/analytics.provision&state=google-35808300當在隨後控制了谷歌標誌的許可頁面上allow按鈕,用戶點擊追溯到callback()

enter image description here

但這次session("user")爲空。它不應該爲空,因爲我在用戶登錄時設置了會話。我不知道爲什麼會發生,以及如何解決此問題。

這是從google權限頁面重定向後的最終網址。 http://localhost:9000/callback?state=google-35808300&code=4/g-FkJ3GGS01jbeXLHK0o95ks-K-drGK7bxgzvi3cELU#

+0

您是否在使用[Google Java客戶端庫](https://developers.google.com/api-client-library/java/google-api-java-client/oauth2#web_server_applications)?如果不是,它可能會大大簡化你正在嘗試做的事情。 – Matt

+0

是的,我正在使用谷歌Java客戶端庫。 –

+1

IP/localhost?確定一致或使用真實域名並重試(使用hosts文件僞造真實的域名)。 HTTP會話與Cookie相關聯,cookie是IP /域特定的。瀏覽器對此也非常嚴格,例如Chrome不喜歡將cookie域明確設置爲「localhost」。 – BalusC

回答

5

這是本地URL http://192.168.100.10:9000/ ...

... & REDIRECT_URI = http://localhost:9000/ ...

這是從谷歌的許可http://localhost:9000/頁面重定向後最終網址。 ...

起始網址與結尾網址不同。這是不正確的。

通常,服務器端的HTTP會話綁定到會話cookie。 Cookie又與特定主機名(IP或域)綁定。 Webbrowser在將Cookie發送到特定主機名時非常嚴格。即使IP將DNS解析到正確的域,web瀏覽器也可能拒絕發送在IP地址上創建的cookie以及域名上的請求。基本上,網絡服務器不會檢索最初創建的會話cookie,因此創建一個新的會話cookie。

然後存在拒絕將其主機名顯式設置爲「localhost」的cookie的網頁瀏覽器,例如Google Chrome:Chrome doesn't create cookie for domain=localhost in broken https。瀏覽器也可能選擇拒絕其主機名明確設置爲IP地址的cookie,因爲當客戶端使用動態IP時,這可能會導致安全問題。

因此強烈建議使用真實的域名,如example.com而不是IP地址或「localhost」。如果不買一個,只需編輯hosts file就可以僞造一個。每行的格式如下,首先是IP地址,然後是期望的域空間。

127.0.0.1 localhost example.com anotherexample.com 

然後在整個過程中始終如一地使用該域。開始於http://example.com:9000/...,使用&redirect_uri=http://example.com:9000/...等。

我不玩Play Framework,但是如果您熟悉Servlet API,那麼在閱讀相關的Q & A:How do servlets work? Instantiation, sessions, shared variables and multithreading後,您可能會更好地理解HTTP會話的工作原理。

相關問題