/ / Microsoft Live Connect для Bing Ads OAuth 2.0 без браузера - java, oauth-2.0, microsoft-live-connect, bing-ads-api

Microsoft Live Connect для Bing Ads OAuth 2.0 без браузера - java, oauth-2.0, microsoft-live-connect, bing-ads-api

Моя загальна мета - мати можливість автоматично завантажувати щодня звіту, використовуючи API оголошень bing. Для цього мені потрібно автентифікація за допомогою OAuth (старий метод автентифікації пароля не робитьробота, тому що у мене є новий обліковий запис Microsoft). Я пройшов "Посібник надання дозволу коду авторизації" вручну і успішно авторизувався. Проблема полягає в:

  • токен дійсний лише 1 годину
  • коли термін дії маркера закінчується, процес вимагає від користувача ввійти вручну за допомогою веб-браузера ще раз і дозволити додатку доступ

Ось приклад настільної програми з використанням OAuth

Хтось теж знає

  • більш відповідний спосіб автентифікації?
  • чи спосіб обходу взаємодії з користувачем?

РІШЕННЯ:

Як згадував @eric urban, авторизацію потрібно проводити лише один раз. після цього підійде маркер оновлення. (Не зовсім очевидно, просто дивлячись на приклад настільного додатка!)

Я написав клас, щоб мати справу з усіма матеріалами OAuth та зберігати маркер оновлення у файлі

public class OAuthRefreshToken {
private static String refreshTokenFileName = "./bingAdsRefreshToken.txt";
private static String ClientId = "XXXXX";
private final OAuthDesktopMobileAuthCodeGrant oAuthDesktopMobileAuthCodeGrant = new OAuthDesktopMobileAuthCodeGrant(ClientId);
private String refreshToken;

public OAuthRefreshToken() {
oAuthDesktopMobileAuthCodeGrant.setNewTokensListener(new NewOAuthTokensReceivedListener() {
@Override
public void onNewOAuthTokensReceived(OAuthTokens newTokens) {
String refreshTime = new java.text.SimpleDateFormat("yyyy-MM-dd HH:mm:ss")
.format(new java.util.Date());
refreshToken = newTokens.getRefreshToken();
System.out.printf("Token refresh time: %sn", refreshTime);

writeRefreshTokenToFile();
}
});

getRefreshTokenFromFile();
refreshAccessToken();
}

public OAuthRefreshToken(String refreshToken) {
this.refreshToken = refreshToken;
writeRefreshTokenToFile();
}

public OAuthDesktopMobileAuthCodeGrant getoAuthDesktopMobileAuthCodeGrant() {
return oAuthDesktopMobileAuthCodeGrant;
}

private void refreshAccessToken(){
oAuthDesktopMobileAuthCodeGrant.requestAccessAndRefreshTokens(refreshToken);
}

private void getRefreshTokenFromFile(){
try {
refreshToken = readFile(refreshTokenFileName, Charset.defaultCharset());
} catch (IOException e) {
e.printStackTrace();
}
}

private static String readFile(String path, Charset encoding)
throws IOException
{
byte[] encoded = Files.readAllBytes(Paths.get(path));
return new String(encoded, encoding);
}

private void writeRefreshTokenToFile(){
File refreshTokenFile = new File(refreshTokenFileName);
try {
FileWriter f2 = new FileWriter(refreshTokenFile);
f2.write(refreshToken);
f2.close();
} catch (IOException e) {
e.printStackTrace();
return;
}

System.out.printf("New refresh token: %sn", refreshToken);
System.out.printf("Stored Safely in: %sn", refreshTokenFileName);
}

}

Використовуйте його у своєму додатку, наприклад:

final OAuthRefreshToken oAuthRefreshToken = new OAuthRefreshToken();
final OAuthDesktopMobileAuthCodeGrant oAuthDesktopMobileAuthCodeGrant = oAuthRefreshToken.getoAuthDesktopMobileAuthCodeGrant();

Відповіді:

1 для відповіді № 1

Ви праві, що згода користувача потрібнаспереду (один раз). Після цього ви можете використовувати маркер оновлення, щоб запросити додаткові маркери доступу без взаємодії користувача. Детальніше про потік надання коду авторизації за допомогою Bing Ads Java SDK див Початок роботи з Java за допомогою служб Bing Ads. Чи допомагає це?


0 для відповіді № 2

Токен оновлення не повинен закінчитися так швидко,вони, як правило, постійні або тривають дуже довго. Однак їх можна скасувати або визнати недійсними, якщо ви запитуєте занадто багато з них. Я вважаю, що коли ви запитуєте більше 25 різних токенів оновлення, вони старіші починають втрачати силу.