Моя общая цель - иметь возможность автоматически загружать ежедневно report using the bing ads API. Для этого мне нужно authenticate with OAuth (старый метод PasswordAuthentication не работает, потому что у меня есть новая учетная запись Microsoft). Я прошел через «Ресурсный поток авторизационного кода» вручную и успешно разрешил себя. Проблема заключается в том:Microsoft Live Connect для рекламы Bing OAuth 2.0 без браузера
- маркер действителен только в течение 1 часа
- когда истекает срок действия маркера, процесс требует, чтобы пользователь вручную Войти с помощью веб-браузер и повторно позволить приложению доступ
Here's an example desktop app using OAuth
знает ли кто-либо
- более достойный способ аутентификации?
- или способ обхода взаимодействия с пользователем?
РЕШЕНИЕ:
Как отметил @eric городской нужно только разрешить вручную, один раз. после этого токен обновления будет делать. (Не совсем очевидно, просто глядя на пример настольного приложения!)
я написал класс, чтобы иметь дело со всеми 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: %s\n", 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: %s\n", refreshToken);
System.out.printf("Stored Safely in: %s\n", refreshTokenFileName);
}
}
Используйте его в вашем приложении, как:
final OAuthRefreshToken oAuthRefreshToken = new OAuthRefreshToken();
final OAuthDesktopMobileAuthCodeGrant oAuthDesktopMobileAuthCodeGrant = oAuthRefreshToken.getoAuthDesktopMobileAuthCodeGrant();
К сожалению, похоже, токен обновления длится до тех пор, пока токен аутентификации. если я жду больше часа между обновлениями, я должен повторно разрешить взаимодействие с пользователем. – marengaz
Дальнейшее взаимодействие с пользователем не требуется, если, конечно, пароль учетной записи Microsoft не изменился или пользователь не удалил разрешения для вашего приложения (кажется, что это явно не случай здесь). Вы должны иметь возможность использовать токены токенов обновления, недели, даже месяцы позже и получить новый токен доступа + новый токен обновления. Приятно помочь устранить неполадки, если у вас есть более подробная информация, например. образец кода. В противном случае, если вы не хотите делиться им на форуме, пожалуйста, свяжитесь с нашей службой поддержки Bing Ads (https://advertise.bingads.microsoft.com/en-us/bing-ads-support). –