2013-08-23 37 views
5

Được rồi vì vậy đây là những gì tôi muốn làm ...Fetch Google Lịch sự kiện trên máy chủ PHP sau khi chứng thực trên ứng dụng iOS

  1. sử dụng ủy quyền cho ứng dụng trên iPhone với đọc/ghi truy cập vào Google lịch
  2. tôi nhận được một thẻ auth của một số loại từ Google
  3. đèo trên thẻ lên máy chủ PHP của tôi và lưu nó trong cơ sở dữ liệu
  4. Sử dụng thẻ để thường xuyên kiểm tra các sự kiện Google và lưu trữ chúng trong cơ sở dữ liệu máy chủ của
  5. Gửi Goog Dữ liệu sự kiện le dưới dạng json vào ứng dụng

Tôi muốn triển khai tìm nạp sự kiện Google trên máy chủ, để tôi có thể tạo thêm chức năng xung quanh chúng như gửi thông báo đẩy từ xa.

Tôi bị kẹt ở phần nhận mã thông báo xác thực và lưu nó trên máy chủ và sử dụng nó để tìm nạp sự kiện từ api lịch của Google, không thể tìm thấy tài nguyên cho cùng. Ai đó có thể ném ánh sáng lên cái này.


CẬP NHẬT

tôi đã có thể để thực hiện thắng lợi các kịch bản cho đến bước 3.

tôi nhận được auth token và refresh token từ Google và lưu nó trong cơ sở dữ liệu. Hiện đang sử dụng Google API php client, tôi đang cố gắng kết nối với API lịch của Google bằng mã thông báo truy cập mà tôi đã nhận trước đó. Tôi đang sử dụng đoạn mã sau ...

require_once(APPPATH . "libraries/Google/Google_Client.php"); 
require_once(APPPATH . "libraries/Google/contrib/Google_CalendarService.php"); 

$client = new Google_Client(); 
$client->setAccessToken($google_access_token); 

$calendar = new Google_CalendarService($client); 
$calendarList = $calendar->calendarList->listCalendarList(); 
echo print_r($calendarList, true); 

Nhưng bây giờ tôi nhận được lỗi này ...

PHP Fatal error: Uncaught exception 'Google_AuthException' with message 'Could not json decode the token' in /myserver/application/libraries/Google/auth/Google_OAuth2.php:162

Stack trace: /myserver/application/libraries/Google/Google_Client.php(170): Google_OAuth2->setAccessToken('a_token...')

Tôi hiểu rằng tôi đang trực tiếp cố gắng để thiết lập các thẻ truy cập trong api khách hàng của Google mà không chỉ định bất kỳ url chuyển hướng hoặc thông số khác thường được sử dụng khi người dùng ủy quyền truy cập vào lịch Google trên chính máy chủ. Điều này có nghĩa vụ phải làm việc như tôi đang cố gắng không?


UPDATE 2

Sau khi một số đào thêm, tôi phát hiện ra rằng trực tiếp thiết lập access token sử dụng setAccessToken không hoạt động như Google client cho API sẽ là một chuỗi mã hóa JSON trong phương pháp setAccessToken. Sau khi một số chỉnh tôi đã thay đổi mã của tôi để sau ....

require_once(APPPATH . "libraries/Google/Google_Client.php"); 
require_once(APPPATH . "libraries/Google/contrib/Google_CalendarService.php"); 

$client = new Google_Client(); 
$client->setAccessType('offline'); 
$client->refreshToken($google_refresh_token); 
$newToken = $client->getAccessToken(); 
$client->setAccessToken($newToken); 

$calendar = new Google_CalendarService($client); 
$calendarList = $calendar->calendarList->listCalendarList(); 
echo print_r($calendarList, true); 

Bây giờ lỗi mà tôi nhận được là của một invalid_request.

Error refreshing the OAuth2 token, message: '{"error" : "invalid_request"}'

Trả lời

3

Cuối cùng tôi có thể trả lời câu hỏi của riêng mình. Hy vọng điều này sẽ giúp người khác.

Bước 1 & 2. Tôi nhận giao thức Google OAuth hoạt động trong Ứng dụng iOS của mình theo hướng dẫn trong this excellent tutorial on mobiletuts.

Bước 3.Tôi đã lưu mã thông báo truy cập và mã thông báo làm mới trong cơ sở dữ liệu trên máy chủ web của mình.

Bước 4. Sử dụng thẻ refresh tôi nhận được từ iOS App tôi kết nối với API Google calendar với mã này ...

require_once(APPPATH . "libraries/Google/Google_Client.php"); 
require_once(APPPATH . "libraries/Google/contrib/Google_CalendarService.php"); 

/* setup google client object */ 
$client = new Google_Client(); 
$client->setClientId(GOOGLE_CLIENT_ID); 

/* refresh access token */ 
$client->refreshToken($google_refresh_token); 
$newToken = $client->getAccessToken(); 
$client->setAccessToken($newToken); 

/* get google calendars list */ 
$calendar = new Google_CalendarService($client); 
$calendarList = $calendar->calendarList->listCalendarList(); 
echo print_r($calendarList, true); 
+0

Bạn có thể loại bỏ hai dòng sau cuộc gọi của bạn cho 'Google_Client :: refreshToken '. Nhận xét trong mã cho hàm đó là "Tìm nạp mã thông báo truy cập OAuth 2.0 mới với mã thông báo làm mới đã cho" và sau đó, mã thông báo truy cập mới sẽ làm mã thông báo truy cập hiện tại cho Ứng dụng khách. – Jonathan

+0

... Ngoài ra, điều này sẽ không hoạt động trừ khi bạn đặt bí mật của khách hàng cũng như ID khách hàng hoặc tôi thiếu gì đó? (N.B. Cả hai 'client_id' và' client_secret' có thể được đặt trong tập tin cấu hình/a cho Ứng dụng PHP API của Google.) – Jonathan

+0

@dvijaz - Cảm ơn bạn đã đọc mẹo về mã thông báo truy cập. Theo như 'client_secret' có liên quan, mã đang hoạt động mà không cần thiết lập' client_secret'. – vikmalhotra