2012-04-11 46 views
5

我已閱讀有關如何使用Google API的文檔,示例和教程,我已經有一個已經運行的迷你應用程序來顯示您的最新活動和信息,但我使用會話來存儲令牌。Google+ OAuth API在首次登錄和授權後存儲和檢索令牌

我的問題是,如何從數據庫中存儲和檢索令牌,以便當用戶(已經註冊的用戶)單擊「登錄」時,它可以立即使用API​​而無需重複授權?請注意,我使用該示例作爲我的迷你應用程序的起點。

這裏有一個代碼片段:

$client = new apiClient(); 
$client->setApplicationName(APP_NAME); 
$client->setClientId(CLIENT_ID); 
$client->setClientSecret(CLIENT_SECRET); 
$client->setRedirectUri(REDIRECT_URL); 
$client->setDeveloperKey(DEV_KEY); 

$plus = new apiPlusService($client); 
$google_userinfo = new apiOauth2Service($client); 

$message = ""; 

// In a real application this would be stored in a database, and not in the session! 
if (isset($_SESSION['token'])) 
    $client->setAccessToken($_SESSION['token']); 

$_SESSION['token'] = $client->getAccessToken(); 

if (isset($_GET['code'])) { 
    $client->authenticate(); 
    // In a real application this would be stored in a database, and not in the session! 
    $_SESSION['token'] = $client->getAccessToken(); 
    header('Location: http://' . $_SERVER['HTTP_HOST'] . $_SERVER['PHP_SELF']); 
} 
... 
//Somewhere here, I added a function that ties $_SESSION['token'] to the user's info. 
... 
<form action="" method="post" id="form1" name="form1"> 
    <fieldset> 
     <div id="main-url-section" style="width: 50%;margin: 0px auto;text-align: center;"> 
     <?php 
      $authUrl = $client->createAuthUrl(); 
      print "<p><a class='login' href='$authUrl'>Log me in!</a></p>"; 
     ?>         
     </div> 
    </fieldset> 
</form> 

非常感謝你的幫助!

問候,

約翰

回答

9

如果您想谷歌跳過了誰已經授權的應用程序的人的授權提示,在你的配置塊頂部添加以下代碼:

$client->setAccessType("online"); 
$client-> setApprovalPrompt("auto"); 

這個解決方案有一個問題:當您完成您的OAuth舞蹈時,您將不會收到刷新令牌。這意味着您的用戶每次訪問令牌到期時都會被重定向到Google的身份驗證服務,以便獲取新的訪問令牌。這將大致每小時發生一次。

背景信息

默認情況下,PHP客戶端庫配置爲提供offline access。你可以在source code中看到這個。啓用此模式時,OAuth流程將產生一個refresh token,可用於根據需要請求新的訪問令牌。你甚至可能不會注意到這種情況。 PHP客戶端庫爲您處理大部分此類事務。

雖然這個刷新令牌是有代價的。你有責任存儲它。如果你失去了它,你的用戶必須重新授權你的應用程序,讓你再次被授予你的應用程序。你存儲它的方式很大程度上取決於你實現的細節。如果您可以使其足夠耐用,會話數據是一種合理的方式。

+0

感謝您的回答!這很有用,我可以將它用作臨時修復。:)我已經檢查過它。但是你知道或者有任何關於如何存儲我在$ client-> getAccessToken()中獲得的令牌的帖子的鏈接嗎?並在用戶登錄時使用它們? – user1239714 2012-04-12 03:03:12

+0

@ user1239714:我不知道有一個特定的地方可以將您的建議鏈接到此處。這完全取決於您如何在應用程序中保留其餘數據。例如,如果您正在編寫典型的LAMP應用程序,則可以將刷新標記存儲在MySql中以便稍後調用。 – mimming 2012-04-13 00:35:19

+1

@JennyMurphy「你可以在源代碼中看到這個」。鏈接被破壞。你能否提供另一個樣本 – knightrider 2013-01-17 17:17:44

0

這是一個古老的問題,但在我看來,答案並不完整。

接受的答案以用戶通過Google Auth服務器的方式工作,但沒有看到Auth屏幕。問題在於存儲令牌並再次使用它,而不會將用戶發送到Google Server。

所以,如果這就是你想要做的(並且它也將允許你訪問用戶數據,即使他們當前沒有使用你的應用程序),你需要做的只是要求一個包含刷新令牌的訪問令牌。

您可以通過使用脫機訪問類型(該方式不是默認設置)來實現此目的 - 例如在php:$client->setAccessType("offline");中。

請記住,您收到的訪問令牌只會在用戶的第一次初始授權中包含刷新令牌,這就是您需要存儲的內容。

然後,您可以在客戶端使用該訪問令牌,即使該訪問令牌已過期,客戶端也會負責刷新它並獲取新的訪問令牌。

希望有幫助, 阿莫斯

相關問題