Search code examples
androidonedrive

OneDrive SDK for android, cannot login silently


I have a standalone Java application that uses a OneDrive Java API I found on github. Everything works nicely.

So I already have a clientid, a client secret, an authorization code and a refresh token which work flawlessly

Now I wanted to switch over to Android, but I wasn't successfull in using the same Java API. That's why I wanted to move to the official OneDrive Android SDK provided by Microsoft.

Everything seems to be different there. I tried the following, using my already known clientid

    final Activity me = this;

    final MSAAuthenticator msaAuthenticator = new MSAAuthenticator() {
        @Override
        public String getClientId() {
            return clientid;
        }

        @Override
        public String[] getScopes() {
            return new String[] { "onedrive.appfolder" };
        }
    };

    final IClientConfig oneDriveConfig = DefaultClientConfig.createWithAuthenticator(
            msaAuthenticator);

    final IOneDriveClient oneDriveClient = new OneDriveClient.Builder()
            .fromConfig(oneDriveConfig)
            .loginAndBuildClient(me);

    oneDriveClient
            .getDrive()
            .buildRequest()
            .get(new ICallback<Drive>() {
                @Override
                public void success(final Drive result) {
                    final String msg = "Found Drive " + result.id;
                    Toast.makeText(me, msg, Toast.LENGTH_SHORT)
                            .show();
                }

                @Override
                public void failure(ClientException ex) {
                    final String msg = "Error";
                    Toast.makeText(me, msg, Toast.LENGTH_SHORT)
                            .show();
                }
            });

It ends up in a seemingly endless loop while executing the line .loginAndBuildClient(me)

In logcat I see that it suppressed an Exception

07-13 12:32:17.082 28175-28271/org.xxxxxxx.xxxxxxxxx E/MSAAuthenticator$5[onAuthComplete] - 314:

Failed silent login, interactive login required

    com.onedrive.sdk.authentication.ClientAuthenticatorException: Failed silent login, interactive login required
        at com.onedrive.sdk.authentication.MSAAuthenticator$5.onAuthComplete(MSAAuthenticator.java:312)

There are also some info messages:

07-13 12:32:17.079 28175-28271/org.xxxxxxx.xxxxxxxxx I/LiveAuthClient:
   No refresh token available, sorry!
07-13 12:32:17.079 28175-28271/org.xxxxxxx.xxxxxxxxx I/LiveAuthClient:
   All tokens expired, you need to call login() to initiate interactive logon

Obviously it somehow wants to perform an interactive login and fails terribly.

What I don't understand: I already have a perfectly valid refresh token which I want to reuse, but I did not find a way to do it in the MS OneDrive SDK.

Can someone help me here?


Solution

  • I managed to implement access to the OneDrive API manually (without using the SDK) and it worked

    Turns out I "only" forgot to set INTERNET permission for the app. Really strange that it caused my app to fail silently.