2012-03-09 41 views
5

我正在努力將Google Apps集成到我的PHP應用程序中。我已經有一個登錄系統,它爲用戶分配一個會話ID(輸入用戶名和密碼後),當用戶登錄時,該會話ID存儲在數據庫中。在一段時間不活動後會話ID變爲無效(用戶可配置,可以是5分鐘,15,60 ...)。該會話ID在URL中傳遞以檢查用戶是否仍然登錄。註銷時,會話ID將從數據庫中刪除。Google Apps和OAuth最佳做法

我讓人們通過將他們的Google ID存儲在數據庫中,當他們登錄時登錄Google,我請求訪問令牌,查詢userinfo,查看谷歌ID是否在數據庫中,如果是,分配一個會話ID給這個用戶。由於我希望能夠查詢其他API,我還將訪問令牌json存儲在數據庫中。當用戶註銷時,訪問令牌也會從數據庫中刪除。

這工作,我的用戶可以登錄使用他們的谷歌帳戶,我可以在API的使用存儲的access_token查詢,但有些事情讓人感到笨拙讓我覺得不確定我的工作流程:

  • 如果你force_approval你得到一個refresh_token,我覺得我應該使用這個刷新令牌來獲得一個新的訪問令牌,而不是從數據庫中刪除舊的令牌,並在用戶再次登錄時輸入一個新令牌。另一方面,登錄時,我不知道它是誰,所以我不知道使用哪個刷新令牌。也許我誤解了刷新令牌的用途。另外,我並不想每次都強制批准,所以在這種情況下我甚至不能使用refresh_token。

  • 如前所述,用戶可以確定他們的會話將持續多長時間,但是,google access_token總是在3600秒後過期。如果用戶在系統上工作一個小時,然後谷歌API突然失效,迫使他們再次登錄,那將是非常愚蠢的。 Google OAuth操場會顯示一個複選框「過期前自動刷新令牌」,但我沒有看到如何操作。我必須在這裏使用刷新標記嗎?或者只是在後臺申請一個新的令牌(如果我不強制批准)?目前,我正在使用userinfo查詢(https://www.googleapis.com/oauth2/v2/userinfo)來查找用戶ID,但我也可以使用tokeninfo(https:///www.googleapis.com/oauth2/v1/tokeninfo)。令牌信息未列在oauth遊樂場中,但結果確實顯示了令牌的有效期(但我也可以自己計算)。一個比另一個更好嗎?我存儲整個json對象在數據庫(access_token,id_token,expires_in和token_type),但我覺得我的應用程序仍然會工作完美,如果我只存儲access_token(只有問題,我預見如果expires_in時間變化)。例如,我需要存儲id_token嗎?

我發現谷歌文​​檔(在developers.google.com)有時也很缺乏的,如果任何人知道的任何其他信息的良好來源,我感興趣的是他們。

回答

4

我認爲這可能會有所幫助,如果你看看最新的OpenID Connect Specs,其中像userinfo端點的概念來自。 OpenID連接建立在OAuth 2之上。這裏有很多,但它仍然值得一看。 This blog article也很好(正如同一個博客中的其他人一樣)。

不幸的是,我不認爲谷歌的實施目前是最新的規格草案,所以它可能會成爲一段時間的移動目標。過去一年這些事情發生了很大變化。

我同意你的第一點,你應該在每次認證用戶時獲得一個新的訪問令牌,而不是刷新舊的訪問令牌。在用戶登錄並授予訪問令牌之前,您不知道用戶是誰。通常,訪問令牌的生命週期不會鏈接到用戶的會話。一旦發佈,您的應用程序理論上可以使用它來訪問與用戶在場無關的資源。如果您想繼續訪問超出令牌到期時間的資源,則需要在該點提交刷新令牌以獲取新的訪問令牌。恐怕我不知道「自動刷新」功能是什麼。

我相信谷歌的tokeninfo類似於OpenID連接的端點check_id,但接受訪問令牌或id令牌,而不僅僅是後者。請注意,兩者的到期時間可能會有所不同。通常,您可以從userinfo端點檢索更詳細的用戶數據,而不是check_id,這通常會返回裸露的user_id

您不應該存儲id_token。這有點像授權服務器的用戶身份驗證記錄。訪問令牌是您的應用程序在驗證用戶身份後有興趣維護的內容。

+0

非常感謝您的意見,我會閱讀您提供的文章,並希望他們能夠一路幫助我。 – Bram 2012-03-12 12:06:40