2016-02-01 154 views
2

所以我試圖做谷歌oauth爲我的用戶(實際上並沒有使用谷歌oauth來保存用戶)得到一個刷新令牌。當我使用客戶端OAuth進行谷歌API時,我的所有工作都已經完成,但是當您進行握手時,只有一個access_token,他們不會提供刷新令牌。我需要一個持久的refresh_token,因爲我要向用戶的谷歌日曆提出很多請求。客戶端OAuth使用谷歌日曆api使用React前端和Rails後端

所以我成立了omniauth我的rails服務器上,使流程是這樣的:

用戶點擊與谷歌(客戶端)認證 - >

彈出屏幕轉到後端服務器(localhost:3001/users/auth/google_oauth2) - >

後端服務器導軌重定向到谷歌的認證 - >

他們與谷歌進行身份驗證和重定向到後端服務器的回調(localhost:3001/users/auth/google_oauth2/callback) - >

後端服務器進行適當的用戶保存令牌,然後重定向回到客戶端應用程序上localhost:3000(沒有什麼需要在客戶端完成,只需要保存在我的服務器上,以便將來使用令牌)

但我確實需要要知道認證是成功的,所以我可以在react/redux中調度適當的操作。在redux-auth中,他們檢查popup.location URI內的access_token。問題是,當我使用這個服務器端彈出的流動,我得到這個討厭的HTTP/HTTPS錯誤:

SecurityError (原始圖像:http://imgur.com/v5NgIGr

如果不是重定向返回給客戶端的我只是重定向到一個視圖我的後端服務器,然後我可以在該頁上有一個腳本,只是window.close()這工作,但似乎對我來說很難受。我在想的另一個潛在的解決方案是嘗試使用api,但我不知道這是否有很好的瀏覽器支持/也似乎hacky。我可以從彈出窗口向另一個窗口(主客戶端應用程序)發送消息,說oauth成功了,所以我的代碼反應並做任何它需要做的事情。

我覺得我只是接近整個流程完全錯誤,或者我錯過了明顯的東西。

我也覺得如果我只是有HTTPS的一切都會工作,因爲以前它是100%客戶端彈出工作得很好,我沒有得到這個SecurityError。我花了一些時間弄清楚如何使用https獲取我的webpack開發服務器,並試圖用rails做同樣的事情(認爲我在rails側做了錯誤的事情),但仍然無法正常工作。也覺得我不應該需要在我的所有開發服務器上強制使用HTTPS才能使其正常工作...

如果有人有任何想法或可以給我一些方向,將不勝感激!

+0

你解決了這個問題嗎? – anoop

回答

2

你正在接近這個錯誤的方式。 Google的認證和他們的API確實有令人困惑的文檔。我也遇到過類似的情況,花了相當多的時間後,我找到了正確的方法來做到這一點。

從你的問題,我相信這似乎是相關鏈接:https://developers.google.com/identity/sign-in/web/server-side-flow

而跟隨它,這裏是你的流量應該如何看起來像:

enter image description here

要映射在你的問題,這是你將要做的:

  1. 用戶點擊谷歌認證(客戶端)
  2. 客戶向Google請求授權,其中包含您的示波器 並收到一次authorization code
  3. 客戶端將此授權碼發送到您的ruby服務器。
  4. Ruby服務器使用授權碼與access_token交換,並持續refresh_token,您將在隨後的請求中使用該API。

希望它有幫助。

+0

你能告訴我在客戶端如何接收代碼的步驟嗎?因爲我們必須給出一個'redirect_url',它將會調用後端。我不確定。 – aks

+0

當你在客戶端調用谷歌認證時,你必須使用'access = offline'。 'redirect_url'應該是客戶端(localhost:3000,就你而言)。 這將返回您的客戶端的授權碼,您將發送到您的Rails服務器。 Rails服務器將交換此代碼的標記(包括刷新令牌)。 – Jazib

相關問題