3

我的总体目标是能够使用 bing ads API 自动下载每日报告。为此,我需要使用 OAuth 进行身份验证(旧的 PasswordAuthentication 方法不起作用,因为我有一个新的 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: %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();
4

2 回答 2

1

您是正确的,需要预先(一次)用户同意。此后,您可以使用刷新令牌来请求其他访问令牌,而无需用户交互。有关使用 Bing Ads Java SDK 的授权代码授予流程的详细信息,请参阅将 Java 与 Bing Ads 服务一起使用入门。这有帮助吗?

于 2016-09-13T17:17:28.530 回答
0

刷新令牌不应该那么快过期,它们通常是永久性的或持续很长时间。但是,如果您请求太多,这些可以被撤销或无效。我相信当您请求超过 25 个不同的刷新令牌时,它们旧的令牌开始变得无效。

于 2016-10-08T22:22:57.830 回答