2012-12-04 24 views
5

tôi đã tự hỏi, tài liệu này có các hướng dẫn để triển khai việc sử dụng API Analytics bằng nhiều ngôn ngữ. Bây giờ trong PHP, chúng hiển thị cách lưu trữ mã thông báo truy cập và duy trì nó, bây giờ tôi giả định JS bằng cách nào đó đã đề cập đến nó trong một số loại lưu trữ cục bộ nhưng tôi không muốn người dùng xác thực mỗi lần anh ta truy cập vào kế hoạch của tôi là lưu mã truy cập & mã thông báo làm mới vào cơ sở dữ liệu của tôi và chỉ cần áp dụng nó cho phía máy khách thay vì đi qua tất cả cửa sổ bật lên.Cách đặt mã thông báo truy cập trên API phân tích?

Theo hướng dẫn này:

gapi.auth.authorize({client_id: clientId, scope: scopes, immediate: false}, result); 

cháy popup mà trả về access token nhưng tôi sẽ nói một lần nữa tôi Intrested trong submiting token từ cơ sở dữ liệu.

Làm cách nào để thực hiện điều đó?

có phương thức gapi.auth.setToken(token) nào sau khi tôi có thể thực hiện cuộc gọi đến API báo cáo chính không?

Trả lời

11

Tôi đã đến đây tìm kiếm giải pháp sử dụng điều này sau khi đã viết PHP để thực hiện auth bằng cách sử dụng thư viện máy khách PHP của google. Tôi muốn chia sẻ mã thông báo được lưu trữ như bạn đã đề cập và có thể sử dụng javascript mà không cần xác thực lại và/hoặc kích hoạt cửa sổ bật lên (có thể có giải pháp cho phương pháp này bằng cách sử dụng phương thức .init(callback), xem tài liệu/liên kết ở cuối).

Có một số gapi.auth.setToken (token) phương pháp

Hóa ra bạn có thể, đó là chính xác setToken(token) chức năng bạn đề cập đến, và, thậm chí bạn có thể chia sẻ những dấu hiệu auth được tạo ra trước đó trong PHP. Những gì tôi không chắc chắn về được nêu ra, là nếu chúng tôi nên làm điều đó :)

Tôi đang sử dụng PHP để thực hiện xác thực ban đầu, nhưng có lẽ trong ứng dụng javascript bạn có thể gọi setToken() trên một cái gì đó mà bạn đã lưu trữ với getToken() theo cách tương tự như ví dụ này. Cũng có thể có cách tiếp cận tốt hơn, như CORS (xem liên kết ở cuối) được đề cập trong tài liệu Xác thực API mà tôi chưa có cơ hội điều tra bất kỳ điều nào trong số này, nhưng tôi có thể đưa ra ví dụ để trả lời câu hỏi, và có thể hữu ích cho những người khác cần có hành vi tương tự

Lần đầu tiên tôi tìm thấy bài đăng trên blog của nhà phát triển Google Dan Holevoet với một số mã JS mẫu.

http://googleappsdeveloper.blogspot.com.au/2011/12/using-new-js-library-to-unlock-power-of.html

Thật tuyệt vời để có thể truy vấn các API trực tiếp với javascript, và tự động load danh sách vv, nhưng điều mà tôi lo lắng về điều này tất nhiên đã được lưu trữ ClientID vv trong js ..

// Snippet from Dan's post 
var clientId = 'YOUR_CLIENT_ID'; 
var apiKey = 'YOUR_API_KEY'; 
var scopes = 'https://www.googleapis.com/auth/calendar'; 

function handleClientLoad() { 
    gapi.client.setApiKey(apiKey); 
    window.setTimeout(checkAuth,1); 
    checkAuth(); 
} 

Nhưng, theo Dan trong một câu trả lời cho câu hỏi giống nhau:

các apiKey được sử dụng kết hợp với dẫn đến nhiều chỉ định, mà bạn phải khai báo trong Bảng điều khiển API. Nếu khóa được gửi từ liên kết giới thiệu trái phép, nó sẽ không hoạt động.Bạn nên làm cho danh sách liên kết giới thiệu được chấp nhận của bạn càng hạn chế càng tốt để đảm bảo rằng những người khác không sử dụng apiKey của bạn cho các yêu cầu của riêng họ.

Bây giờ, ví dụ của tôi dành cho API lịch, nhưng tất cả dường như khá phù hợp với các API khác.

Lưu ý: Đoạn mã này chỉ dành cho mục đích chứng minh khái niệm và có thể không được sử dụng trong sản xuất. Tôi giả định bảo vệ liên kết giới thiệu được đề cập làm cho một cái gì đó như thế này OK để thực hiện, nhưng cần phải có nhiều suy nghĩ hơn. Nó có thể được thực hiện bởi đầu vào ẩn, AJAX gọi vv .. Nhưng cuối cùng, tất cả chúng sẽ được hiển thị trong javascript.

Tôi đã làm gì để kiểm tra các khái niệm là:

  • Authenticate qua libs client PHP, sử dụng cùng một kịch bản/URL như callback (xem [bảng điều khiển API] [2] cho các callbacks)
  • Trên xác thực thành công, trong gọi lại, hãy đặt biến javascript chung trong trang thành mã xác thực PHP được lưu trữ
  • Khi trang được tải, trong sự kiện nhấp đầu tiên của bạn để sử dụng javascript (hoặc thậm chí trong tài liệu sẵn sàng), hãy gọi authMe() để đặt mã thông báo
  • Sau đó tiếp tục như bình thường, calli ng bất kỳ phương pháp API javascript mà bạn đã đưa ra phạm vi để trong quá trình xác thực PHP ban đầu (trong trường hợp này makeApiCall())

Giống như vậy:

Trong thói quen php gọi lại, cho dù chứng thực chưa (giả định rằng URL gọi lại của bạn là kịch bản giống nhau), làm cho điều này var toàn cầu

<script type="text/javascript"> 
    // A place to stick PHP's auth token once the auth dance is done 
    var dodgey_global_access_token = {}; 
</script> 

Bây giờ, trong php gọi lại thói quen khi chúng tôi đã kiểm tra mà chúng ta đang chứng thực, và $_SESSION['token'] = $client->getAccessToken(); đã được gọi là (IE lưu trữ mã thông báo xác ở đâu đó cho sau này), hoặc ít nhất $client->getAccessToken() có một cái gì đó có ý nghĩa:

<script type="text/javascript"> 
// Set the js var via PHP here.. Yeck... Note json encode in php and parse in jquery 
dodgey_global_access_token = $.parseJSON (<?php echo json_encode ($client->getAccessToken()); ?>); 
// dodgey_global_access_token now contains the auth token structure 

// Removed auth-related functions in Dan's code - we'll already have a token 

// Dan's orig function to list events in 'primary' calendar 
function makeApiCall() { 
    gapi.client.load('calendar', 'v3', function() { 
    var request = gapi.client.calendar.events.list({ 
     'calendarId': 'primary' 
    }); 

    request.execute(function(resp) { 
     for (var i = 0; i < resp.items.length; i++) { 
     var li = document.createElement('li'); 
     li.appendChild(document.createTextNode(resp.items[i].summary)); 
     document.getElementById('events').appendChild(li); 
     } 
    }); 
    }); 
} 

// My function to setToken with the token injected from PHP authentication 
function authMe() { 
    // Stuff the token into the gapi object 
    gapi.auth.setToken(dodgey_global_access_token); 

    // Now call the original 'makeAPICall' function now that we're 'authenticated' 
    makeApiCall(); 
} 
</script> 

Lưu ý: tôi đã sử dụng jquery trong ví dụ của tôi để nhanh chóng phân tích cú pháp JSON, chúng tôi đã sử dụng nó trong dự án, nhưng nếu không, bạn sẽ phải tìm một thư viện để làm như vậy

liên quan/docs hữu ích:

// Sorry, as a new poster I can only post 2 hyperlinks, 
// so embedding this in code snippet 
// 
// http://code.google.com/p/google-api-javascript-client/wiki/ReferenceDocs#gapi 
// http://code.google.com/p/google-api-javascript-client/wiki/Authentication 
// http://code.google.com/p/google-api-javascript-client/issues/detail?id=22 
// http://code.google.com/p/google-api-javascript-client/wiki/CORS 
// https://code.google.com/apis/console 

Hãy cho tôi biết nếu bất cứ điều gì trở nên mù mờ, và có thể gửi một mẫu làm việc để demo.

+0

Điều này có vẻ như một câu trả lời chắc chắn, cảm ơn bạn. –

+0

này hoạt động tốt, giống như trường hợp của tôi bây giờ, tôi đang sử dụng thư viện php cho oauth, và gọi thiết bị đầu cuối, tôi không biết làm thế nào để sử dụng accesstoken tôi nhận được từ php đến javascript cho đến bây giờ. Tôi đã cố gắng để chỉ echo mã thông báo truy cập vào 'gapi.auth.setToken' nhưng tôi phát hiện ra bởi bây giờ mà nó đòi hỏi json là giá trị. cảm ơn người đàn ông này. – CaffeineShots

0

Google API documentation đã thay đổi một chút kể từ khi câu trả lời này được cung cấp lần đầu tiên. google-api-javascript-client không còn là thư viện được đề xuất để truy cập thư viện api của Google và Google đề xuất sử dụng discovery documents để tải các thư viện cụ thể. Kết quả là, các công việc mà bạn đang tìm kiếm để tải tất cả các thư viện thiết lập các thẻ truy cập sẽ trông như thế này:

var token = 'someaccesstokenfromoauth2' 
gapi.load('client:auth2', function(){ 
    gapi.client.load(
    'https://analyticsreporting.googleapis.com/$discovery/rest', 
    'v4' 
).then(function(){ 
    gapi.auth.setToken({ access_token: token }) 
    // business logic with gapi.client.analyticsreporting() 
    }) 
}) 

tải GAPI với:

<script src="https://apis.google.com/js/api.js"></script> 
Các vấn đề liên quan