关于Oracle Mobile Hub 应用程序的验证选项

您的用户可以使用多种技术在您的Oracle Mobile Hub 应用程序中进行验证,包括 OAuth、一次登入、HTTP 基本验证和 Facebook 登录。

关于 OAuth 使用者

您的用户可以使用 OAuth Consumer 验证您的Oracle Mobile Hub Android 应用程序。

首先初始化授权代理并将验证类型设置为 OAUTH

private AuthorizationAgent mAuthorization; 
private MobileBackend mobileBackend; 

try {
  mobileBackend = MobileManager.getManager().getMobileBackend(this);
} catch (ServiceProxyException e) {
      e.printStackTrace();
}

mAuthorization = mobileBackend.getAuthorization(AuthType.OAUTH);

然后,使用 authenticate 方法尝试验证。该调用包括 Android 上下文、用户名、口令和完成授权过程的回调的参数:

TextView username, password; 
username = (TextView) findViewById(R.id.username);
password = (TextView) findViewById(R.id.password); 
String userName = username.getText().toString(); 
String passWord = password.getText().toString();
mAuthorization.authenticate(mCtx, userName, passWord, mLoginCallback); 

下面是回调的定义 :

AuthorizationCallback mLoginCallback = new AuthorizationCallback() {
   @Override
   public void onCompletion(ServiceProxyException exception) {
     Log.d(TAG, "OnCompletion Auth Callback");
      if (exception != null) {
        Log.e(TAG, "Exception while receiving the Access Token", exception);
     } else {
        Log.e(TAG, "Authorization successful");
     }
   }
 }

关于使用第三方标记进行单点登录验证

可以使用第三方提供方发布的令牌来验证移动应用。

首先,应用程序需要从第三方标记发布者获取标记。获取标记的方式不同于发布者。

在您有标记后,初始化授权代理并在授权调用中使用标记。

private AuthorizationAgent mAuthorization; 
private MobileBackend mobileBackend; 
Context mCtx = getApplicationContext();

try {
  mobileBackend = MobileManager.getManager().getMobileBackend(this);
} catch (ServiceProxyException e) {
      e.printStackTrace();
}

mAuthorization = mobileBackend.getAuthorization(AuthType.TOKENEXCHANGE);

然后,使用 authenticateUsingTokenExchange 方法尝试验证。

mAuthorization.authenticateUsingTokenExchange(mCtx, token, false, mLoginCallback);

此处为回调:

AuthorizationCallback mLoginCallback = new AuthorizationCallback() {
    @Override
    public void onCompletion(ServiceProxyException exception) {
        if (exception == null) {
            //redirect to another Activity after login
            Intent intent = new Intent(mCtx, ContentActivity.class);
            startActivity(intent);
  
        } else {
            Log.e(TAG, "Exception during token exchange:", exception);
            finish();
        }
    }
};

注 :

Oracle Mobile Hub 中存储第三方标记的默认失效时间为 6 小时。可以通过更改 Security_TokenExchangeTimeoutSecs 策略来调整此时间。

您还可以对应用程序进行编码以保持用户登录,即使在关闭和重新启动应用程序时也是如此。

在上面的示例中,调用 authenticateUsingTokenExchange()方法时,第三个参数(storeToken)设置为 false。如果将此参数设置为 true 并且标记交换成功,MCS 标记将存储在安全存储中,用户将一直保持登录,直到标记失效。

然后,您可以使用 Authorization 对象上的 loadSSOTokenExchange 方法加载存储的标记。如果无法从安全存储检索标记,方法将返回 false

此处是尝试加载已保存标记的一些代码,如果失败,则重新启动验证过程:

try {
    mAuthorization = MobileManager.getManager().getMobileBackend(this).getAuthorization();
    if (!mAuthorization.loadSSOTokenExchange(mCtx)) {
        //user not logged in, so need to initiate login
        mAuthorization.authenticateUsingTokenExchange(mCtx, token, true, mLoginCallback);
    }

在安全存储中存储标记时,该标记仍与应用程序最初使用的移动后端相关联。因此,如果应用程序更新为使用其他移动后端(或移动后端版本),则需要清除保存的标记并重新验证。

mAuthorization.clearSSOTokenExchange(mCtx);
mAuthorization.authenticateUsingTokenExchange(mCtx, token, true, mLoginCallback);

关于基本 HTTP 验证

使用 HTTP Basic 对用户进行身份验证类似于使用 OAuth 进行验证。

首先初始化授权代理并将验证类型设置为 BASIC_AUTH

private AuthorizationAgent mAuthorization; 
private MobileBackend mobileBackend; 

try {
  mobileBackend = MobileManager.getManager().getMobileBackend(this);
} catch (ServiceProxyException e) {
      e.printStackTrace();
}

mAuthorization = mobileBackend.getAuthorization(AuthType.BASIC_AUTH)

然后,使用 authenticate 方法尝试验证。该调用包括 Android 上下文、用户名、口令和完成授权过程的回调的参数。

TextView username, password; 
username = (TextView) findViewById(R.id.username);
password = (TextView) findViewById(R.id.password);
String userName = username.getText().toString(); 
String passWord = password.getText().toString();
mAuthorization.authenticate(mCtx, userName, passWord, mLoginCallback); 

下面是回调的定义 :

AuthorizationCallback mLoginCallback = new AuthorizationCallback() {
   @Override
   public void onCompletion(ServiceProxyException exception) {
     Log.d(TAG, "OnCompletion Auth Callback");
     if (exception != null) {
       Log.e(TAG, "Exception while receiving the Access Token", exception);
     } else {
   Log.e(TAG, "Authorization successful");
   }
  }
 }

关于使用 Facebook 登录

如果要使用 Facebook 登录,可以使用 oracle_mobile_android_social 库中的类。

首先初始化授权代理并将验证类型设置为 Facebook

SocialAuthorizationAgent mAuthorization;
SocialMobileBackend socialMobileBackend;
try {
  socialMobileBackend = SocialMobileBackendManager.getManager().getMobileBackend(mCtx);
} catch(ServiceProxyException e){
    e.printStackTrace();
}
mAuthorization = socialMobileBackend.getSocialAuthorization(); mAuthorization.setAuthType(AuthType.FACEBOOK);


通过 Facebook SDK 中的 CallbackManager 对象启动验证。

private CallbackManager callbackManager;
mAuthorization.setup(getApplicationContext(), callback);
callbackManager = mAuthorization.getCallBackManager();
mAuthorization.authenticateSocial(mCtx);

此处的代码可用于上面传递的 callback

private FacebookCallback<LoginResult> callback = new FacebookCallback<LoginResult>() {
    @Override
    public void onSuccess(LoginResult loginResult) {
        Log.e(TAG, "facebook login successful.");
    }
    @Override
    public void onCancel() {
    }
    @Override
    public void onError(FacebookException e) {
    }
};

覆盖 onActivityResult()方法以使用回调:

@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    callbackManager.onActivityResult(requestCode, resultCode, data);