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