使用 Android 和 Rest API 了解 OneDrive 中的身份验证流程

Understanding authentication flow in OneDrive with Android and Rest API

我尝试从 OneDrive API 实施登录方法,但我不确定我是否正确理解了工作流程。 基本上,在第一次启动该应用程序时,我希望同时拥有登录名 window 和 "authorise the app to..." window”。但是,当用户再次启动该应用程序时,我想直接连接到应用程序,没有任何 window。 相反,使用以下代码,我继续使用第二个 window(用户决定接受该应用程序)

@Override
public void signIn() {
     //personal code
    linkingStarted = true;
    signInStatus = SignInStatus.SIGNING_IN;
    activity.setUpWait(R.layout.popup_waitgif_white);
    //end of personal code

    mAuthClient = AuthClientFactory.getAuthClient(activity.getApplication());


    if (mAuthClient.getSession().isExpired() && Util.isConnectedToInternet(activity)) {
        activity.alertOnUIThread("Login again");
        activity.runOnUiThread(new Runnable() {
            @Override
            public void run() {
                mAuthClient.login(activity, SCOPES, mAuthListener);

            }
        });

    } else if (!Util.isConnectedToInternet(activity)) {
        activity.alertOnUIThread(activity.getString(R.string.alert_verifyconnection));

    } else {
        activity.alertOnUIThread("Resigned In OneDrive");
        signInStatus = SignInStatus.SIGNED_IN;


        mAuthClient.initialize(SCOPES, new AuthListener() {
            @Override
            public void onAuthComplete(final AuthStatus status, final AuthSession session, final Object userState) {
                if (status == AuthStatus.CONNECTED) {

                    authToken = session.getAccessToken();
                    oneDriveService = getOneDriveService();

                    signInStatus = SignInStatus.SIGNED_IN;

                } else {
                    authenticationFailure();
                    Log.v(TAG, "Problem connecting");
                }
            }

            @Override
            public void onAuthError(final AuthException exception, final Object userState) {
                //mAuthClient.login(activity, SCOPES, mAuthListener);
            }
        }, null, authToken);
    }


}

而 AuthClientFactory 就是这样的:

public class AuthClientFactory {

private static AuthClient authClient;
private static final String CLIENT_ID = "00000000XXXXX";


public static AuthClient getAuthClient(Context context) {
    if (authClient == null)
        authClient = new AuthClient(context, OneDriveOAuthConfig.getInstance(), CLIENT_ID);
    return authClient;
}

}

使用 OneDrive SDK for Android 会更轻松,因为身份验证过程要简单得多。

final MSAAuthenticator msaAuthenticator = new MSAAuthenticator() {
   @Override
   public String getClientId() {
      return "<msa-client-id>";
   }

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

final IClientConfig oneDriveConfig = new DefaultClientConfig.createWithAuthenticator(msaAuthenticator);
final IOneDriveClient oneDriveClient = new OneDriveClient
                                        .Builder()
                                        .fromConfig(oneDriveConfig)
                                        .loginAndBuildClient(getActivity());

这将处理用户身份验证流程,然后为您提供一个服务对象,使您可以直接与 OneDrive 进行交互。查看完整的 example application.