You might see that the Dropbox Community team have been busy working on some major updates to the Community itself! So, here is some info on what’s changed, what’s staying the same and what you can expect from the Dropbox Community overall.
Forum Discussion
dimapavlov3333
11 months agoNew 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);
Я все правильно сделал
// Инициализация 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();
- dimapavlov3333New member | Level 2
Эти ключи я беру ваш_клиентский_ключ:ваш_секретный_ключ
Из
Правильно?App keyxxxxApp secret - Greg-DBDropbox 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.
- dimapavlov3333New member | Level 2
Спасибо
- dimapavlov3333New 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();
About Dropbox API Support & Feedback
Find help with the Dropbox API from other developers.
5,910 PostsLatest Activity: 2 days agoIf you need more help you can view your support options (expected response time for an email or ticket is 24 hours), or contact us on X or Facebook.
For more info on available support options for your Dropbox plan, see this article.
If you found the answer to your question in this Community thread, please 'like' the post to say thanks and to let us know it was useful!