Exemple d'implémentation de demande de ressource personnalisée Java™
Cet exemple explique comment obtenir des données depuis une ressource protégée à l'aide d'un objet HttpRequest personnalisé et de l'API AuthorizationManager de MobileFirst.
L'exemple implémente un flux OAuth standard : d'abord, une demande de ressource est envoyée sans jeton d'accès. Elle échoue avec une erreur d'autorisation. Ensuite, WLAuthorizationManager est utilisé afin d'obtenir un jeton d'accès pour la portée de protection de la ressource, et la demande est envoyée à nouveau avec le jeton d'accès obtenu en tant qu'en-tête d'autorisation. La demande de ressource est créée à l'aide d'un objet HttpURLConnection standard.
package com.sample.oauthdemoandroid;
import android.os.AsyncTask;
import com.worklight.wlclient.api.WLAccessTokenListener;
import com.worklight.wlclient.api.WLAuthorizationManager;
import com.worklight.wlclient.api.WLClient;
import com.worklight.wlclient.api.WLFailResponse;
import com.worklight.wlclient.auth.AccessToken;
import java.io.IOException;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.List;
import java.util.Map;
public class CustomRequestAsyncTask extends AsyncTask<Object, Void, Void> {
public static final String HEADER_AUTHORIZATION = "Authorization";
private Object[] params;
@Override
protected Void doInBackground(Object[] params) {
android.os.Debug.waitForDebugger(); // pour le débogage
this.params = params;
sendRequest(null);
return null;
}
private void sendRequest(AccessToken accessToken) {
HttpURLConnection urlConnection = null;
try {
// Créez la demande pour accéder à l'adresse URL de ressource
URL url = new URL(WLClient.getInstance().getServerUrl().toString() + params[0]);
urlConnection = (HttpURLConnection) url.openConnection();
if (accessToken != null) {
// Ajoutez un jeton d'accès à la demande
urlConnection.setRequestProperty(HEADER_AUTHORIZATION, accessToken.getAsAuthorizationRequestHeader());
}
// Envoyez la demande
Map<String, List<String>> headerFields = urlConnection.getHeaderFields();
// Vérifiez si la demande a abouti
int responseCode = urlConnection.getResponseCode();
if (200 <= responseCode && responseCode <= 299) {
customRequestSuccess(urlConnection);
} else {
// Vérifiez si l'accès à la ressource requiert une autorisation
WLAuthorizationManager wlAuthorizationManager = WLAuthorizationManager.getInstance();
if (wlAuthorizationManager.isAuthorizationRequired(responseCode, headerFields)) {
switch (responseCode) {
case 409: // Erreur de conflit de serveur
// Renvoyez la demande
sendRequest(accessToken);
break;
case 401: // Jeton d'accès non valide ou inexistant
// Effacez le jeton d'accès (s'il existe)
if (accessToken != null) {
wlAuthorizationManager.clearAccessToken(accessToken);
}
// Obtenez un jeton d'accès valide et renvoyez la demande
resendWithAccessToken(headerFields);
break;
case 403: // Erreur de portée insuffisante
// Obtenez la portée de la ressource depuis la réponse et renvoyez la demande
resendWithAccessToken(headerFields);
break;
default: // Erreur inattendue
customRequestFailure(urlConnection);
}
} else {
customRequestFailure(urlConnection);
}
}
} catch (IOException e) {
e.printStackTrace();
} finally {
if (urlConnection != null) {
urlConnection.disconnect();
}
}
}
private void customRequestSuccess(HttpURLConnection urlConnection) throws IOException {
// TODO : Implémentez la méthode.
}
private void customRequestFailure(HttpURLConnection urlConnection) throws IOException {
// TODO : Implémentez la méthode.
}
private void resendWithAccessToken(Map<String, List<String>> headerFields) {
WLAuthorizationManager wlAuthorizationManager = WLAuthorizationManager.getInstance();
// Obtenez la demande de ressource depuis la réponse
String scope = wlAuthorizationManager.getResourceScope(headerFields);
// Obtenez un jeton d'accès et renvoyez la demande
CustomRequestObtainAccessTokenListener customRequestObtainAccessTokenListener = new CustomRequestObtainAccessTokenListener();
wlAuthorizationManager.obtainAccessToken(scope, customRequestObtainAccessTokenListener);
}
private class CustomRequestObtainAccessTokenListener implements WLAccessTokenListener {
@Override
public void onSuccess(AccessToken accessToken) {
sendRequest(accessToken);
}
@Override
public void onFailure(WLFailResponse response) {
// TODO : Implémentez la méthode.
}
}
}