问题
I am trying assign a userid to user and I am getting error . I am following as steps below. server details.
<realm loginModule="AuthLoginModule" name="AuthRealm">
<className>com.worklight.integration.auth.AdapterAuthenticator</className>
<parameter name="login-function" value="AuthAdapter.onAuthRequired"/>
<parameter name="logout-function" value="AuthAdapter.onLogout"/>
</realm>
</realms>
<loginModule name="AuthLoginModule">
<className>com.worklight.core.auth.ext.NonValidatingLoginModule</className>
</loginModule>
<customSecurityTest name="AuthSecurityTest">
<test isInternalUserID="true" realm="AuthRealm"/>
</customSecurityTest>
Adapter
function onAuthRequired(headers, errorMessage){
errorMessage = errorMessage ? errorMessage : null;
return {
authStatus: "credentialsRequired",
errorMessage: errorMessage
};
}
function submitAuthentication(username, password){
// if (username==="user" && password === "password"){
var userIdentity = {
userId: username,
displayName: username,
attributes: {
foo: "bar"
}
};
WL.Server.setActiveUser("AuthRealm", userIdentity);
return {
authStatus: "complete"
};
// }
// return onAuthRequired(null, "Invalid login credentials");
}
function getSecretData(){
return {
secretData: "Very very very very secret data"
};
}
function onLogout(){
WL.Logger.debug("Logged out");
}
Adapter xml
<procedure name="submitAuthentication" securityTest="wl_unprotected" />
<procedure name="getSecretData" securityTest="AuthSecurityTest"/>
Android code:
public class MFPInitializer {
Context mContext;
public AndroidChallengeHandler challengeHandler;
private String realm = "AuthRealm";
WLClient client = null;
private static MFPInitializer mfpInitializer = new MFPInitializer();
/* A private Constructor prevents any other
* class from instantiating.
*/
private MFPInitializer() {
}
/* Static 'instance' method */
public static MFPInitializer getInstance() {
return mfpInitializer;
}
void mfpConnector(WLClient client) {
challengeHandler = new AndroidChallengeHandler(realm);
client.registerChallengeHandler(challengeHandler);
client.connect(new WLResponseListener() {
@Override
public void onSuccess(WLResponse wlResponse) {
Log.d("Success--- MFP_connect", wlResponse.getResponseText());
}
@Override
public void onFailure(WLFailResponse wlFailResponse) {
Log.d("fail-- MFP_connect", wlFailResponse.getErrorMsg());
}
});
}
public void logout() {
if (client != null) {
client.logout(realm, new WLRequestListener() {
@Override
public void onSuccess(WLResponse wlResponse) {
}
@Override
public void onFailure(WLFailResponse wlFailResponse) {
}
});
}
}
public WLClient mfpInit(Context context) {
mContext = context;
try {
client = WLClient.createInstance(context);
if (client != null) {
mfpConnector(client);
}
} catch (Exception e) {
e.printStackTrace();
}
return client;
}
public static void registerUser() {
try {
URI adapterPath = new URI("/adapters/AuthAdapter/getSecretData");
WLResourceRequest request = new WLResourceRequest(adapterPath, WLResourceRequest.GET);
request.setQueryParameter("params", "[]");
request.send(new WLResponseListener() {
@Override
public void onSuccess(WLResponse wlResponse) {
Log.d("onsuccess--------", wlResponse.getResponseText());
}
@Override
public void onFailure(WLFailResponse wlFailResponse) {
Log.d("onfail--------", wlFailResponse.getErrorMsg());
}
});
} catch (URISyntaxException e) {
e.printStackTrace();
}
}
}
Android challenge Handler
public class AndroidChallengeHandler extends ChallengeHandler {
// private Activity parentActivity;
private WLResponse cachedResponse;
public AndroidChallengeHandler( String realm) {
super(realm);
// parentActivity = activity;
}
@Override
public void onFailure(WLFailResponse response) {
try {
submitFailure(response);
} catch (Exception e) {
e.printStackTrace();
}
}
@Override
public void onSuccess(WLResponse response) {
submitSuccess(response);
}
@Override
public boolean isCustomResponse(WLResponse response) {
try {
if(response!= null &&
response.getResponseJSON()!=null &&
!response.getResponseJSON().isNull("authStatus") &&
response.getResponseJSON().getString("authStatus") != ""){
return true;
}
} catch (JSONException e) {
e.printStackTrace();
}
return false;
}
@Override
public void handleChallenge(WLResponse response){
cachedResponse = response;
Log.d( "handleChallenge: ---- ",response.getResponseText());
try {
if(response.getResponseJSON().getString("authStatus").equals("credentialsRequired")){
// MainAdapterBasedAuth.setMainText("handleChallenge->credentialsRequired");
// Intent login = new Intent(parentActivity, LoginAdapterBasedAuth.class);
// parentActivity.startActivityForResult(login, 1);
}
else if(response.getResponseJSON().getString("authStatus").equals("complete")){
Log.d( "handleChallenge: ---- ",response.getResponseText());
submitSuccess(cachedResponse);
}
} catch (JSONException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public void submitLogin( String userName, String password){
Object[] parameters = new Object[]{userName, password};
WLProcedureInvocationData invocationData = new WLProcedureInvocationData("AuthAdapter", "submitAuthentication");
invocationData.setParameters(parameters);
WLRequestOptions options = new WLRequestOptions();
options.setTimeout(30000);
submitAdapterAuthentication(invocationData, options);
}
}
Intally in activity 1 a I am calling, which will initialize wlclient and adding realm.
MFPInitializer.getInstance().mfpInit(getApplicationContext());
But when I am trying to submit the login to setuser to device in mobile first platform my app crashes
MFPInitializer mfpInitializer= MFPInitializer.getInstance();
mfpInitializer.challengeHandler.submitLogin("user","Passcode");
I am getting following errors
on android monitor.
ava.lang.NullPointerException: Attempt to invoke virtual method 'boolean com.worklight.wlclient.WLRequest.shouldFailOnChallengeCancel()' on a null object reference
on eclipse(MFP)
An error occurred while invoking procedure [project _MFP]AuthAdapter/submitAuthenticationFWLSE0100E: parameters: [project _MFP]
Cannot change identity of an already logged in user in realm 'AuthRealm'. The application must logout first.
FWLSE0101E: Caused by: [pro
The above mentioned error got resolved but the new userid is not getting updated In the mobilefirst console.
Can you please help me where I am doing mistake.
回答1:
As mentioned in the comments, this problem was resolved by updating to the latest available iFix release from the IBM Fix Central website.
来源:https://stackoverflow.com/questions/37789992/calling-setactiveuser-throws-error