cancel
Showing results for 
Show  only  | Search instead for 
Did you mean: 
Announcements
Share your feedback on the Document Scanning Experience in the Dropbox App right here.

Dropbox API Support & Feedback

Find help with the Dropbox API from other developers.

cancel
Showing results for 
Show  only  | Search instead for 
Did you mean: 

Re: Помогите с кодом

Помогите с кодом

dimapavlov3333
New member | Level 2

У меня ошибка 400 и я не понимаю в чем проблема сам код:

let accessToken = 'Я стёр';
let dbx = new Dropbox({ accessToken, fetch });

// Функция для обновления токена
async function refreshAccessToken() {
try {
let response = await fetch('https://api.dropbox.com/oauth2/token', {
method: 'POST',
headers: {
'Content-Type': 'application/x-www-form-urlencoded',
'Authorization': `Basic ${Buffer.from('ваш_клиентский_ключ:ваш_секретный_ключ').toString('base64')}`
},
body: new URLSearchParams({
grant_type: 'refresh_token',
refresh_token: accessToken
})
});

if (response.ok) {
let data = await response.json();
let newAccessToken = data.access_token;
dbx = new Dropbox({ accessToken: newAccessToken, fetch });
accessToken = newAccessToken;
dbx.auth.setRefreshToken(data.refresh_token);
console.log('Токен Dropbox успешно обновлен');
} else {
console.error('Ошибка при обновлении токена Dropbox:', response.status);
}
} catch (error) {
console.error('Ошибка при обновлении токена Dropbox', error);
}
}

refreshAccessToken();

setInterval(refreshAccessToken, 10000);

1 Accepted Solution

Accepted Solutions

dimapavlov3333
New member | Level 2

Я все правильно сделал

// Инициализация Dropbox SDK с ключом приложения и токеном обновления
let dbx = new Dropbox({ clientId: 'ваш_идентификатор_клиента', refreshToken: 'ваш_токен_обновления' });

// Функция для выполнения операции
async function callDropboxApi() {
try {
// Выполняем операцию, например, загрузку файла
let response = await dbx.filesListFolder({ path: '' });
let accessToken = dbx.getAccessToken();
console.log('Токен доступа:', accessToken);
console.log(response);
} catch (error) {
if (error.status === 401) {
// Если получили ошибку 401 (Unauthorized), значит токен устарел
// SDK автоматически обновит токен и повторит операцию
console.log('Токен Dropbox устарел, обновление и повторная попытка');
callDropboxApi();
} else {
console.error('Ошибка при вызове API Dropbox:', error);
}
}
}

// Вызываем функцию для выполнения операции
callDropboxApi();

View solution in original post

4 Replies 4

dimapavlov3333
New member | Level 2

Эти ключи я беру ваш_клиентский_ключ:ваш_секретный_ключ
Из 
Правильно?

App key
xxxx
App secret

Greg-DB
Dropbox Staff

Во-первых, обратите внимание: всякий раз, когда вы получаете подобный ответ об ошибке, например, с кодом ошибки 400, обязательно проверьте тело ответа, поскольку оно может содержать более полезное сообщение об ошибке.


Однако, глядя на ваш код на основе вашего «refresh_token: accessToken», похоже, что вы предоставляете токен доступа вместо токена обновления. Этот параметр «refresh_token» должен быть токеном обновления. Токены доступа и токены обновления — это разные типы токенов, которые не являются взаимозаменяемыми.


Чтобы выполнить этот вызов /oauth2/token с помощью Grant_type: 'refresh_token', вам уже необходимо иметь токен обновления. Успешный вызов /oauth2/token с помощью Grant_type: 'refresh_token' вернет новый токен доступа; он не вернет токен обновления.


Чтобы получить токен обновления, вам необходимо выполнить вызов /oauth2/token с помощью Grant_type: 'authorization_code'. Дополнительную информацию можно найти в руководстве по OAuth и документации по авторизации. В этом сообщении блога приведена базовая схема обработки этого потока, которая может служить полезным примером.


Однако, поскольку вы используете Dropbox JavaScript SDK, вам все равно не нужно реализовывать это самостоятельно. Примеры использования этого с Dropbox JavaScript SDK см. в примерах, включенных в папку «examples» в SDK. Пока вы предоставляете необходимые учетные данные, например, устанавливаете ключ приложения (он же идентификатор клиента) и токен обновления, как показано в этом примере для JavaScript SDK, SDK фактически будет автоматически обрабатывать процесс обновления. (Обратите внимание, что секрет приложения также необходим, если приложение не использует PKCE.) SDK автоматически обнаруживает ошибки токена доступа с истекшим сроком действия и вызывает API для выполнения обновления, чтобы при необходимости получить новый кратковременный токен доступа.


Кроме того, да, ключ клиента и секрет клиента — это ключ приложения и секрет приложения.


-----------–
Пожалуйста, извините за наши переводы. Наши ответы были созданы с помощью онлайн-переводчика. Мы хотели бы поддерживать все языки, но в настоящее время у нас нет для этого возможностей. Вот английская версия:

-----------–
Please excuse our translations. Our responses were created using an online translator. We'd like to support every language, but we're not currently equipped to do so. Here is the English version:
-----------–

 

First, note that whenever you get a error response like that, such as with the 400 error code, be sure to check the response body, as it may contain a more useful error message.

 

Looking at your code though, based on your "refresh_token: accessToken", it looks like you're supplying an access token instead of a refresh token. That "refresh_token" parameter would need to be a refresh token. Access tokens and refresh tokens are different types of tokens and are not interchangeable.

 

In order to perform that call to /oauth2/token with grant_type: 'refresh_token', you need to already have the refresh token. A successful call to /oauth2/token with grant_type: 'refresh_token' would return a new access token; it would not return a refresh token.

 

In order to get a refresh token, you would need to perform a call to /oauth2/token with grant_type: 'authorization_code'. You can find more information in the OAuth Guide and authorization documentation. There's a basic outline of processing this flow in this blog post which may serve as a useful example.

 

Since you're using the Dropbox JavaScript SDK though, you don't need to implement this yourself anyway. For examples of using this with the Dropbox JavaScript SDK, please refer to the examples included in the "examples" folder in the SDK. As long as you supply the necessary credentials, for instance, set the app key (a.k.a. client ID) and refresh token, like shown in this example for the JavaScript SDK, the SDK will actually handle refresh process for you automatically. (Note that the app secret is also required if the app does not use PKCE.) The SDK will automatically catch expired access token errors and call the API to perform the refresh to get a new short-lived access token when needed.

 

Also, yes, the client key and client secret are the app key and app secret.

dimapavlov3333
New member | Level 2

Спасибо

dimapavlov3333
New member | Level 2

Я все правильно сделал

// Инициализация Dropbox SDK с ключом приложения и токеном обновления
let dbx = new Dropbox({ clientId: 'ваш_идентификатор_клиента', refreshToken: 'ваш_токен_обновления' });

// Функция для выполнения операции
async function callDropboxApi() {
try {
// Выполняем операцию, например, загрузку файла
let response = await dbx.filesListFolder({ path: '' });
let accessToken = dbx.getAccessToken();
console.log('Токен доступа:', accessToken);
console.log(response);
} catch (error) {
if (error.status === 401) {
// Если получили ошибку 401 (Unauthorized), значит токен устарел
// SDK автоматически обновит токен и повторит операцию
console.log('Токен Dropbox устарел, обновление и повторная попытка');
callDropboxApi();
} else {
console.error('Ошибка при вызове API Dropbox:', error);
}
}
}

// Вызываем функцию для выполнения операции
callDropboxApi();

Need more support?