当前位置: 首页 > 知识库问答 >
问题:

如何在不登录php的情况下刷新dropbox api中的访问令牌

阎俊英
2023-03-14

我使用https://github.com/kunalvarma05/dropbox-php-sdk我的php项目上传文件在dropbox。

在这里,我不需要任何用户使用Dropbox,它只适用于内部用户,因此我可以在我的Dropbox上上传文件。

我从Dropbox应用程序生成了访问令牌,一切正常,但令牌在一段时间后过期。我做了一次 Oauth 登录以重新生成令牌,但新令牌在一段时间后也过期了。

我如何在后端重新生成令牌或获得长寿命令牌,以便我的脚本在用户每次新上传后都可以在dropbox上传文件?

我正在使用这个简单的代码

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());

                }
            }
        } 

共有2个答案

吴丁雷
2023-03-14

我找到了解决方案

步骤1:第一次通过授权/登录URL登录,您将获得访问令牌和身份验证后的刷新令牌,将此刷新令牌保存在数据库或env文件中。它的寿命很长。(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;
    }

调用此函数以获取新的访问令牌

夏兴平
2023-03-14

Dropbox不再提供检索新的长期访问令牌的选项。相反,它发出短期访问令牌和可选的刷新令牌,而不是长期访问令牌。

尽管如此,应用程序仍然可以通过请求“离线”访问来获得长期访问,在这种情况下,应用程序会收到一个“刷新令牌”,可以根据需要检索新的短期访问令牌,而无需进一步的人工干预。您可以在OAuth指南和授权文档中找到更多信息。

不可能完全自动化检索访问令牌和可选刷新令牌的过程。这需要用户手动完成至少一次。如果您的应用需要保持长期访问,而用户无需重复手动重新授权,应用应请求“离线”访问,以便获得刷新令牌。刷新令牌不会过期,可以在需要时重复存储和使用,以获取新的短期访问令牌,而无需用户手动重新授权应用。

 类似资料:
  • 在PHP中编码,我尝试初始化Spotify API,不使用重定向uri,只使用client_id和client_secret。我尝试下面的代码:从响应url中提取令牌-Spotify API,但我得到一个NULL结果 我想知道我是否可以在不要求用户登录的情况下访问令牌(参见https://developer.spotify.com/web-api/authorization-guide/#auth

  • 问题内容: 我有个问题。我想防止用户访问页面而不登录jsf2。当用户直接将受限制的页面网址写入浏览器时,他/她应该看不到该页面。就像上述情况那样,他/她必须被重定向到登录页面。如何以编程方式执行此操作? 问题答案: 这取决于您如何设置登录名。您似乎正在使用本地认证,其中将登录用户设置为会话范围的受管Bean的属性。因为使用Java EE提供的容器管理登录名,已经考虑了防止访问受限页面。 假设你已经

  • 问题内容: 我在JSF页面中有这3个字段 我也有一个具有以下属性的后备豆: 我希望在将某些值插入字段val1和val2中而不刷新页面时,outputText元素自动更改其值。结果变量应以这种方式计算(它正在计算百分比):(val1 * val2)/ 100 您能帮我解决我的一些疑问吗?: 我知道为此,我需要javascript或AJAX之类的东西。您认为最好的方法是什么? 我很想知道我如何使用AJ

  • 问题内容: 我的页面结构是: 如何在不刷新整个页面的情况下更新/刷新组件? 一旦用户成功登录,我想在标题中隐藏“登录”链接。标题在所有组件/路由中都是通用的。 问题答案: 您可以使用 来在整个应用程序的不同组件之间进行通信。您可以定义一个数据共享服务,其中包含 您可以订阅和发出更改的服务。 定义数据共享服务 在您的 提供商条目中添加。 接下来,将导入到您和您在其中执行登录操作的组件中。在订阅主题更

  • 当我使用自己的客户端id在浏览器中转到以下URL时: https://account-d.docusign.com/oauth/auth?response_type=token 我需要登录,然后我被重定向到:http://localhost:8888/auth#access_token=myAccessToken 现在我有一个节点。在js应用程序中,我想使用我的访问令牌进行API调用,直到现在,我

  • 我正在开发一个企业应用程序,管理员在其中创建新用户(没有注册表单)。我正在使用Firebase Auth,它在很多方面都很棒,但我在我的用例中遇到了一个问题。当您使用时,由此创建的用户将自动登录。当管理员创建用户帐户时,这显然不起作用。有没有办法避免这种行为?谢了。