2012-04-11 18 views
5

Tôi đã đọc tài liệu, ví dụ và hướng dẫn về cách sử dụng API Google, tôi có một ứng dụng nhỏ đang chạy cho thấy hoạt động và thông tin mới nhất của bạn, nhưng tôi sử dụng các phiên để lưu trữ mã thông báo.Lưu trữ API OAuth Google+ và truy xuất mã thông báo sau khi đăng nhập và ủy quyền lần đầu tiên

Câu hỏi của tôi là, làm cách nào để lưu trữ và truy xuất mã thông báo từ cơ sở dữ liệu để khi người dùng đã đăng ký nhấp vào "đăng nhập", nó có thể sử dụng API ngay lập tức mà không được phép lặp lại? Lưu ý rằng tôi đã sử dụng ví dụ làm điểm bắt đầu cho ứng dụng nhỏ của mình.

Dưới đây là một đoạn mã:

$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> 

Cảm ơn bạn rất nhiều vì sự giúp đỡ!

Kính trọng,

John

Trả lời

9

Nếu bạn muốn Google bỏ qua nhắc nhở cấp quyền cho những người đã ủy quyền ứng dụng của bạn, thêm mã này trong khối cấu hình của bạn ở phía trên:

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

Có một sự bắt đầu với giải pháp này: bạn sẽ không nhận được mã thông báo làm mới khi bạn hoàn thành điệu nhảy OAuth của mình. Điều này có nghĩa là người dùng của bạn sẽ được chuyển hướng đến dịch vụ xác thực của Google mỗi lần mã thông báo truy cập của họ hết hạn để tìm nạp mã mới. Điều này sẽ xảy ra khoảng mỗi giờ.

Background Thông tin

Theo mặc định thư viện khách PHP được cấu hình để cung cấp offline access. Bạn có thể thấy điều này trong số source code. Khi chế độ này được bật, luồng OAuth sẽ mang lại một số refresh token có thể được sử dụng để yêu cầu mã thông báo truy cập mới nếu cần. Bạn thậm chí có thể không nhận thấy điều này xảy ra. Thư viện máy khách PHP quản lý hầu hết điều này cho bạn.

Mã thông báo làm mới này có tính phí. Bạn có trách nhiệm lưu trữ nó. Nếu bạn bị mất, người dùng của bạn phải ủy quyền lại đơn đăng ký của bạn để bạn được cấp một đơn đăng ký khác. Cách bạn lưu trữ nó phụ thuộc rất nhiều vào chi tiết triển khai của bạn. Dữ liệu phiên là một cách hợp lý để làm điều này nếu bạn có thể làm cho nó đủ bền.

+0

Cảm ơn câu trả lời này! Điều này là hữu ích và tôi có thể sử dụng nó như là một sửa chữa tạm thời. :) Tôi đã kiểm tra nó ra. Nhưng bạn có biết hoặc có một liên kết đến bất kỳ bài viết về cách lưu trữ các thẻ tôi nhận được trong $ client-> getAccessToken()? và sử dụng chúng khi người dùng đăng nhập? – user1239714

+0

@ user1239714: Tôi không biết một địa điểm cụ thể nào để liên kết bạn để được tư vấn tại đây. Nó phụ thuộc hoàn toàn vào cách bạn duy trì phần còn lại của dữ liệu trong ứng dụng của bạn. Ví dụ, nếu bạn đang viết một ứng dụng LAMP điển hình, nó có thể có ý nghĩa để lưu trữ mã thông báo làm mới trong MySql để thu hồi sau. – mimming

+1

@JennyMurphy "Bạn có thể thấy điều này trong mã nguồn". Liên kết bị hỏng. Bạn có thể vui lòng cung cấp một mẫu khác – knightrider

0

Đây là câu hỏi cũ nhưng có vẻ như với tôi câu trả lời chưa hoàn chỉnh.

Câu trả lời được chấp nhận hoạt động theo cách người dùng thực hiện thông qua máy chủ Google Auth, chỉ cần không nhìn thấy màn hình Auth. Câu hỏi đặt ra là lưu trữ mã thông báo và sử dụng lại mã thông báo mà không cần gửi người dùng đến Google Server. Vì vậy, nếu đó là những gì bạn muốn làm (và nó cũng sẽ cho phép bạn truy cập dữ liệu người dùng ngay cả khi họ hiện không sử dụng ứng dụng của bạn), tất cả những gì bạn cần làm là yêu cầu mã thông báo truy cập bao gồm mã thông báo làm mới .

Bạn thực hiện việc này bằng cách sử dụng loại truy cập ngoại tuyến (theo cách này không phải là mặc định nữa) - ví dụ: trong php: $client->setAccessType("offline");.

Chỉ cần nhớ rằng mã thông báo truy cập bạn nhận sẽ chỉ bao gồm mã thông báo làm mới trong ủy quyền ban đầu đầu tiên của người dùng, vì vậy đó là những gì bạn cần lưu trữ.

Sau đó, bạn chỉ có thể sử dụng mã thông báo truy cập đó với ứng dụng khách, ngay cả khi nó hết hạn và khách hàng sẽ chăm sóc làm mới và nhận mã mới.

Hy vọng điều đó sẽ giúp ích, Amos

Các vấn đề liên quan