首頁  >  問答  >  主體

無需登入的情況下如何在PHP中刷新Dropbox API的存取令牌

<p>我正在使用https://github.com/kunalvarma05/dropbox-php-sdk來上傳檔案到我的dropbox。 </p> <p>這裡我不需要任何用戶使用dropbox,只是為了內部用戶,所以我可以上傳文件到我的dropbox。 </p> <p>我從Dropbox應用程式產生了存取令牌,一切正常,但令牌在一段時間後會過期。我進行了一次Oauth登入來重新產生令牌,但新的令牌在一段時間後也會過期。 </p> <p>我該如何重新生成令牌或獲取長期有效的令牌,以便在每次用戶上傳新檔案後,我的腳本可以將檔案上傳到dropbox? </p> <p>我正在使用這段簡單的程式碼</p> <pre class="brush:php;toolbar:false;">include('dropbox/vendor/autoload.php'); $app = new DropboxApp("client_id", "client_secret", 'access_token'); $dropbox = new Dropbox($app); $data = []; // here getting list of files from database if (!$data->isEmpty()) { foreach ($data as $list) { $filePath = 'folder_path/'.$list->file_name; $fileName = $list->file_name; try { // Create Dropbox File from Path $dropboxFile = new DropboxFile($filePath); // Upload the file to Dropbox $uploadedFile = $dropbox->upload($dropboxFile, "/folder_name/" . $fileName, ['autorename' => true]); // File Uploaded echo $uploadedFile->getPathDisplay(); } catch (DropboxClientException $e) { print_r($e->getMessage()); } } }</pre></p>
P粉239164234P粉239164234390 天前552

全部回覆(2)我來回復

  • P粉066224086

    P粉0662240862023-08-27 00:33:27

    Dropbox不再提供檢索新的長期存取權杖的選項。相反,它發放短期訪問令牌和可選的刷新令牌,而不是長期訪問令牌。

    應用程式仍然可以透過要求“離線”存取來獲得長期存取權限,此時應用程式會收到一個“刷新令牌”,可以根據需要檢索新的短期存取令牌,而無需進一步手動使用者乾預。您可以在OAuth指南授權文件中找到更多資訊。

    無法完全自動化檢索存取令牌和可選刷新令牌的過程。這需要用戶手動進行至少一次。如果您的應用程式需要在不需要使用者重複手動重新授權的情況下保持長期訪問權限,則應該請求「離線」訪問,以獲得刷新令牌。刷新令牌不會過期,可以儲存並重複使用,以在需要時取得新的短期存取令牌,而無需使用者手動重新授權應用程式。

    回覆
    0
  • P粉364642019

    P粉3646420192023-08-27 00:13:53

    我找到了解決方案

    步驟1:首次透過授權/登入URL登錄,完成身份驗證後,您將獲得存取權杖和刷新令牌,將刷新令牌保存在資料庫或環境文件中。它的壽命很長。 (https://github.com/kunalvarma05/dropbox-php-sdk/wiki/Authentication-and-Authorization)

    步驟2:使用刷新令牌,使用下列程式碼產生新的存取令牌

    public function refreshToken()
        {
            $arr = [];
            $ch = curl_init();
            curl_setopt($ch, CURLOPT_URL, 'https://api.dropbox.com/oauth2/token');
            curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
            curl_setopt($ch, CURLOPT_POST, 1);
            curl_setopt($ch, CURLOPT_POSTFIELDS, "grant_type=refresh_token&refresh_token=<refresh_token_here>");
            curl_setopt($ch, CURLOPT_USERPWD, '<APP_KEY>'. ':' . '<APP_SECRET>');
            $headers = array();
            $headers[] = 'Content-Type: application/x-www-form-urlencoded';
            curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
            $result = curl_exec($ch);
            $result_arr = json_decode($result,true);
            
    
            if (curl_errno($ch)) {
                $arr = ['status'=>'error','token'=>null];
            }elseif(isset($result_arr['access_token'])){
                $arr = ['status'=>'okay','token'=>$result_arr['access_token']];
            }
            curl_close($ch);
            return $arr;
        }

    呼叫此函數以取得新的存取令牌

    回覆
    0
  • 取消回覆