2012-03-26 34 views
7

Tôi đang cố gắng sử dụng API dữ liệu YouTube của Google với PHP dựa trên tài liệu của Google tại đây: https://developers.google.com/youtube/2.0/developers_guide_protocol_oauth2#OAuth2_Refreshing_a_Token. Vấn đề của tôi xuất hiện khi xác thực với OAuth. Tôi đang sử dụng URL ủy quyền sau giống hệt với tài liệu nói để sử dụng ngoại trừ khóa chuyển hướng và khóa ứng dụng của tôi, rõ ràng.Mã thông báo làm mới API Google API không được gửi

$this->authorizationUrl = 'https://accounts.google.com/o/oauth2/auth?'; 
$this->authorizationUrl .= 'client_id=' . $this->applicationKey . '&'; 
$this->authorizationUrl .= 'redirect_uri=' . $this->redirect_uri . '/account.php?action=youtube_oauth&'; 
$this->authorizationUrl .= 'scope=https://gdata.youtube.com&'; 
$this->authorizationUrl .= 'response_type=code&'; 
$this->authorizationUrl .= 'access_type=offline'; 

Sau đó, khi các tài liệu nói đến, tôi cuộn tròn như sau:

$curl_options = Array(
      CURLOPT_POSTFIELDS => Array(
       'code' => $code, 
       'client_id' => $this->applicationKey, 
       'client_secret' => $this->applicationSecret, 
       'redirect_uri' => $this->redirect_uri . '/account.php?action=youtube_oauth', 
       'grant_type' => 'authorization_code' 
      ), 
      CURLOPT_RETURNTRANSFER => true, 
      CURLOPT_URL => 'https://accounts.google.com/o/oauth2/token' 
     ); 

Tuy nhiên, phản ứng của tôi không bao giờ mang lại cho tôi một refresh_token như tài liệu của họ nói rằng họ cần. Tôi chỉ nhận được ba mục phản hồi khác.

Một số câu hỏi như thế này: Get refresh token google api đã nói sử dụng approval_prompt = force, nhưng điều đó không hoạt động hoặc hoàn toàn thất bại với mục đích có access_type = offline.

Bất kỳ ý tưởng nào về lý do tại sao tôi nhận được phản hồi hợp lệ với 3 trong số 4 mục phản hồi?

Trả lời

2

Bạn có thể dùng thử sân chơi google oauth2 (https://code.google.com/oauthplayground/) và xem sự khác nhau giữa các thông số của bạn và ở đó.

28

Từ phần offline access của các tài liệu OAuth2.0:

Khi ứng dụng của bạn nhận được một mã thông báo làm mới, đó là quan trọng để lưu trữ mà refresh thẻ để sử dụng trong tương lai. Nếu ứng dụng của bạn mất mã thông báo làm mới, ứng dụng sẽ phải nhắc lại người dùng để được chấp thuận trước khi nhận mã thông báo làm mới khác. Nếu bạn cần để nhắc người dùng đồng ý, hãy bao gồm thông số approval_prompt trong yêu cầu mã ủy quyền và đặt giá trị thành force.

Vì vậy, khi bạn đã cấp quyền truy cập, yêu cầu tiếp theo cho một grant_type của authorization_code sẽ không trả lại refresh_token, ngay cả khi access_type được thiết lập để offline trong chuỗi truy vấn của trang có sự đồng ý.

Như đã nêu trong đoạn trích trên, để có được một mớirefresh_token sau khi đã nhận được một, bạn sẽ cần phải gửi người dùng của bạn trở lại thông qua nhanh chóng, mà bạn có thể làm bằng cách thiết lập approval_prompt-force.

Chúc mừng,

PS Thay đổi này cũng được công bố trong số blog post.

+1

Cảm ơn bạn đã giải pháp! – WHITECOLOR

+3

Ai đó chấp nhận điều này làm câu trả lời! –

+1

Vì lợi ích của bất cứ ai khác bị lẫn lộn của chính tôi, một khi bạn nhận được một 'mã thông báo làm mới' bạn không cần phải _refresh_ nó cũng như bạn có thể sử dụng cùng một lần lặp đi lặp lại. Thời gian duy nhất bạn nên cần một cái mới là nếu bạn mất nó hoặc người dùng thu hồi quyền truy cập của bạn. – jeteon

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