繁体   English   中英

如何使用Dropbox Java / Android SDK v2自动进行身份验证?

[英]How to auth automatically with Dropbox Java/Android SDK v2?

为了提高应用程序质量,我正在测试:单元测试和UI测试。 由于我在应用程序中具有Dropbox支持,因此我想对其进行测试,并且我需要在测试之前对Dropbox帐户进行身份验证(在我的Android应用程序中,用户能够保存文件,读取文件,重命名等-基本文件例程)。

Dropbox为Java / Android SDK v2提供了示例,但即使命令行工具也需要一些手动操作-使用URL打开浏览器应用并选择帐户:

// Run through Dropbox API authorization process
        DbxRequestConfig requestConfig = new DbxRequestConfig("examples-authorize");
        DbxWebAuth webAuth = new DbxWebAuth(requestConfig, appInfo);
        DbxWebAuth.Request webAuthRequest = DbxWebAuth.newRequestBuilder()
            .withNoRedirect()
            .build();

        String authorizeUrl = webAuth.authorize(webAuthRequest);
        System.out.println("1. Go to " + authorizeUrl);
        System.out.println("2. Click \"Allow\" (you might have to log in first).");
        System.out.println("3. Copy the authorization code.");
        System.out.print("Enter the authorization code here: ");

        String code = new BufferedReader(new InputStreamReader(System.in)).readLine();
        if (code == null) {
            System.exit(1); return;
        }
        code = code.trim();

        DbxAuthFinish authFinish;
        try {
            authFinish = webAuth.finishFromCode(code);
        } catch (DbxException ex) {
            System.err.println("Error in DbxWebAuth.authorize: " + ex.getMessage());
            System.exit(1); return;
        }

        System.out.println("Authorization complete.");
        System.out.println("- User ID: " + authFinish.getUserId());
        System.out.println("- Access Token: " + authFinish.getAccessToken());

是否可以在无需手动交互的情况下自动进行Dropbox身份验证? 我希望提供应用密钥/机密,帐户电子邮件/密码并获取会话的accessToken

PS。 我想避免使用Robelectric + Espresso,并将其保留在单元/集成测试中,而不是在UI测试中。

不可以,Dropbox API没有提供自动执行应用授权流程的方法。

请注意,尽管您可以存储和重复使用访问令牌,所以您可能只想手动为测试帐户获取一个令牌,然后重新使用它即可。

这是我的测试模板(希望对您有所帮助)。 您必须执行TODO并至少手动两次运行测试(粘贴身份验证代码和访问令牌),然后才能进行测试。 接下来的所有测试调用都不需要手动执行任何操作。

public class DropboxFileSystemTest {

    // credentials
    private static final String APP_KEY = ""; // TODO : paste your app key
    private static final String APP_SECRET = ""; // TODO : paste your app secret

    // do run the test and follow the instructions
    private static final String accountEmail = "test@domain.com"; // TODO : paste your test Dropbox account
    private static String authCode; // TODO : run the test and paste auth code
    private static String accessToken // TODO : run the test and paste access

    private DbxAppInfo appInfo = new DbxAppInfo(APP_KEY, APP_SECRET);

    // Run through Dropbox API authorization process
    private DbxRequestConfig requestConfig = new DbxRequestConfig(DropboxFileSystemTest.class.getSimpleName());
    private DbxWebAuth webAuth = new DbxWebAuth(requestConfig, appInfo);

    private void startAuth() throws IOException {
        DbxWebAuth.Request webAuthRequest = DbxWebAuth.newRequestBuilder()
            .withNoRedirect()
            .build();

        String authorizeUrl = webAuth.authorize(webAuthRequest);
        System.out.println("1. Go to " + authorizeUrl);
        System.out.println("2. Click \"Allow\" (you might have to log in first). WARNING: log-in to " + accountEmail);
        System.out.println("3. Copy the authorization code.");
        System.out.println("4. Paste the authorization code to this test `this.authCode` value");
        System.out.println("5. Re-run the test");
    }

    private DbxClientV2 client; // to be used for the requests

    private void initWithAccessToken() {
        DbxRequestConfig config = new DbxRequestConfig(UUID.randomUUID().toString());
        client = new DbxClientV2(config, accessToken);
    }

    private void initAndVerifyAccount() throws DbxException {
        initWithAccessToken();

        // check expected account (trying to prevent user account to be wiped out)
        DbxClientV2 client = DbxClientHolder.get().getClient();
        FullAccount account = client.users().getCurrentAccount();
        if (!account.getEmail().equals(accountEmail))
            throw new RuntimeException("Wrong account: current is " + account.getEmail() + ", but " + accountEmail + " is expected");
    }

    private void clearFileSystem() throws FileSystemException {
        // TODO : clear Dropbox file system
    }

    @Before
    public void setUp() throws IOException, FileSystemException, DbxException {
        auth();
        clearFileSystem();
    }

    private void finishAuth() {
        DbxAuthFinish authFinish;
        try {
            authFinish = webAuth.finishFromCode(authCode);
        } catch (DbxException ex) {
            System.err.println("Error in DbxWebAuth.authorize: " + ex.getMessage());
            System.exit(1); return;
        }

        System.out.println("Authorization complete.");
        System.out.println("- User ID: " + authFinish.getUserId());
        System.out.println("- Access Token: " + authFinish.getAccessToken());
        System.out.println();

        System.out.println("1. Copy the access token");
        System.out.println("2. Paste the access token to this test `this.accessToken` value");
        System.out.println("3. Re-run the test");

        accessToken = authFinish.getAccessToken();
    }

    private void auth() throws IOException, FileSystemException, DbxException {
        if (accessToken == null) {
            if (authCode != null ) {
                finishAuth();
                throw new RuntimeException("Manual actions required: copy-paste access token");
            } else {
                startAuth();
                throw new RuntimeException("Manual actions required: copy-paste authCode");
            }
        } else {
            initAndVerifyAccount();
        }
    }

    @After
    public void tearDown() throws FileSystemException {
        if (client != null) {
            clearFileSystem();
        }
    }

    @Test
    public void testSmth() {
        // TODO : write your test using `this.client` for requests
    }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM