2015-09-21 24 views
13

Làm cách nào để ủy quyền cho Ứng dụng khách của Google vĩnh viễn cho đến khi người dùng hủy bỏ ủy quyền?Truy cập ngoại tuyến PHP API của Google API, "invalid_grant: Mã đã được đổi"

Tôi đang cố gắng tạo ứng dụng kết nối với Lịch Google. Nó phải chạy bằng PHP và do đó tôi đang sử dụng ứng dụng khách PHP API của Google do google cung cấp.

Ứng dụng cần có quyền truy cập ngoại tuyến để ứng dụng hoạt động khi người dùng không có trong phiên. Ứng dụng này được thiết kế để cho phép người dùng quản lý và hiển thị lịch của anh ấy công khai trên các trang web và như vậy.

Tôi đã tạo thông tin xác thực trong Google Console, sử dụng phương thức dịch vụ (có ID khách hàng và bí mật ứng dụng khách). Sử dụng ứng dụng khách Google API, tôi cũng đã yêu cầu ủy quyền từ người dùng. Tôi mở một cửa sổ trình duyệt mới, người dùng cho phép, mã ủy quyền được Google trả lại. Tôi lấy mã này, lưu trữ và sử dụng nó để cho phép khách hàng kết nối thành công với Lịch Google và trao đổi dữ liệu.

Bây giờ, tôi hiểu đây là mã thông báo sắp hết hạn. Trừ khi một người sử dụng truy cập ngoại tuyến mà tôi đã đặt. Tuy nhiên, sau một vài phút hoặc ít hơn tôi sẽ luôn luôn nhận được một lỗi: Error fetching OAuth2 access token, message: 'invalid_grant: Code was already redeemed.

Đây là mã tôi sử dụng để kết nối các khách hàng:

$client = new \Google_Client(); 
$client->setApplicationName('My App'); 
$client->setScopes(array(\Google_Service_Calendar::CALENDAR)); 
$client->setClientId($this->google_client_id); 
$client->setClientSecret($this->google_client_secret); 
$client->setRedirectUri($this->google_client_redirect); 
$client->setAccessType('offline'); 

if ($code = $this->google_client_auth) { 

    try { 

     $client->authenticate($code); 

    } catch(\Exception $e) { 
      var_dump($e); 
    }  

} 

return new \Google_Service_Calendar($client); 

Đây là một phương pháp bên trong một lớp.

ID ứng dụng khách và bí mật của ứng dụng khách được lưu trữ trong cài đặt ứng dụng.

Tôi cũng đang lưu trữ mã được trả về bởi người dùng trong cài đặt, nhưng tôi nghĩ đây là nơi tôi đang làm sai? Tôi đang đặt liên kết tới cửa sổ Google OAuth theo một phương pháp riêng biệt (cũng sử dụng cùng một id khách hàng và bí mật và đặt phương thức ngoại tuyến cũng như. Và để có được ủy quyền đang hoạt động. Tôi có thể truy cập vào lịch. Nó chỉ không kéo dài ...

Trả lời

24

Có ba loại mã hoặc tokens Googles Authentcation lợi nhuận máy chủ.

  1. mã xác thực
  2. truy cập thẻ
  3. Mã thông báo làm mới.

Mã xác thực

Khi người dùng nhấp vào hình thức Authentcation và cấp quyền truy cập ứng dụng của bạn. Google trả lại cho bạn mã xác thực. Bạn nên lấy mã này và trao đổi mã thông báo truy cập và mã thông báo làm mới. Mã này chỉ được sử dụng một lần nếu bạn cố gắng và sử dụng nó một lần nữa, bạn sẽ nhận được một thông báo lỗi.

invalid_grant: Code was already redeemed.

truy cập thẻ

thẻ truy cập được sử dụng để truy cập vào các API thẻ này nên được gửi cùng với tất cả các yêu cầu bạn thực hiện.thẻ truy cập được ngắn sống họ làm việc cho một giờ và sau đó họ ngừng làm việc

Refresh thẻ

Refresh thẻ nên được lưu trên máy chủ của bạn một số nơi. Khi mã thông báo truy cập hết hạn, bạn có thể sử dụng mã thông báo làm mới để nhận mã thông báo truy cập mới.

Vấn đề của bạn là bạn đang lưu mã xác thực không sử dụng cho bạn. Bạn cần tìm mã thông báo làm mới và lưu mã đó.

+0

cảm ơn ... nhưng tại sao tôi cần cả mã thông báo truy cập và mã thông báo làm mới ngay lập tức? Api có hai phương thức getAccessToken và getRefreshToken. Nhưng chỉ có một setter setAccessToken. Khi tôi lấy mã Auth từ người dùng, tôi có thể chạy getAuth() -> xác thực nhưng API không nói nếu nó trả về là một mã thông báo Access hoặc Refresh. Tôi có cần phải vượt qua kết quả của getAuth-> xác thực đến setAccessToken không? Vậy thì getAccessToken là gì? – unfulvio

+1

cũng, từ API của Google PHP, có vẻ như mã thông báo truy cập là đối tượng json, nhưng mã thông báo làm mới là một chuỗi? Vậy tôi có phải chuyển mã thông báo làm mới cho phương thức getAuth-> authenticate() không? – unfulvio

+1

tìm thấy một số câu trả lời ở đây: https://developers.google.com/identity/protocols/OAuth2WebServer?hl=vi – unfulvio

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