apis android rest authorization retrofit magento-1.9

android - apis - magento api



Auth 1.0 oauth_signature creation Android para la API de magento (2)

No necesitábamos pasar todos los atributos como auth, la actualización se encarga de esto, solo necesitamos pasar CONSUMER_KEY, CONSUMER_SECRET, ACCESS_TOKEN y TOKEN_SECRET.

Siguiendo this

La clase de ApiUtils será como,

Kotlin

class ApiUtils { companion object { fun getAPIService(): APIService? { val consumer = OkHttpOAuthConsumer(BuildConfig.CONSUMER_KEY, BuildConfig.CONSUMER_SECRET) consumer.setTokenWithSecret(BuildConfig.ACCESS_TOKEN, BuildConfig.TOKEN_SECRET) return RetrofitClient.getClient(BuildConfig.BASE_URL, consumer)?.create(APIService::class.java) } }

}

Android Java

public class ApiUtils { private ApiUtils() { } private static final String BASE_URL = BuildConfig.BASE_URL; public static APIService getAPIService() { OkHttpOAuthConsumer consumer = new OkHttpOAuthConsumer(BuildConfig.CONSUMER_KEY, BuildConfig.CONSUMER_SECRET); consumer.setTokenWithSecret(BuildConfig.ACCESS_TOKEN, BuildConfig.TOKEN_SECRET); OkHttpClient client = new OkHttpClient.Builder() .addInterceptor(new SigningInterceptor(consumer)) .build(); return RetrofitClient.getClient(BASE_URL, client).create(APIService.class); } }

y para la clase RetrofitClient

Kotlin

class RetrofitClient { companion object { private var retrofit: Retrofit? = null private val gSON = GsonBuilder() .setLenient() .create() fun getClient(baseUrl: String, consumer: OkHttpOAuthConsumer): Retrofit? { val logging = HttpLoggingInterceptor() if (BuildConfig.DEBUG) { logging.level = HttpLoggingInterceptor.Level.BODY } else { logging.level = HttpLoggingInterceptor.Level.NONE } val httpClient = OkHttpClient.Builder() httpClient.connectTimeout(60000, TimeUnit.SECONDS) httpClient.writeTimeout(120000, TimeUnit.SECONDS) httpClient.readTimeout(120000, TimeUnit.SECONDS) httpClient.retryOnConnectionFailure(true) httpClient.addInterceptor(SigningInterceptor(consumer)) httpClient.addInterceptor { chain -> val request = chain.request() val requestBuilder = request.newBuilder() .header(HEADER_CONTENT_TYPE_KEY, PreferenceHandler.getContentType()) .header(HEADER_ACCEPT_KEY, PreferenceHandler.getAcceptType()) .header(HEADER_CACHE_CONTROL_KEY, PreferenceHandler.getCacheControl()) val modifiedRequest = requestBuilder.build() chain.proceed(modifiedRequest) } httpClient.addNetworkInterceptor(logging) if (retrofit == null) { retrofit = Retrofit.Builder() .baseUrl(baseUrl) .addConverterFactory(GsonConverterFactory.create(gSON)) .client(httpClient.build()) .build() } return retrofit } } }

Android java

public class RetrofitClient { private static Retrofit retrofit = null; public static Retrofit getClient(String baseUrl,OkHttpClient client) { if (retrofit == null) { retrofit = new Retrofit.Builder() .baseUrl(baseUrl) .client(client) .addConverterFactory(GsonConverterFactory.create()) .build(); } return retrofit; } }

Llamo a la API de Magento con la siguiente autenticación como encabezado,

auth = "OAuth oauth_consumer_key=**********************,oauth_consumer_secret=****************,oauth_token=************,oauth_token_secret=**************,oauth_signature_method=HMAC-SHA1,oauth_timestamp=" + ConstantFunctions.GetTimeStamp() + ",oauth_nonce=" + ConstantFunctions.GetNonce() + ",oauth_signature=*******************) ;

Mientras llamo a la API, oauth_problem=signature_invalid error oauth_problem=signature_invalid Todos los demás parámetros se validan correctamente pero obtuvieron un error en la firma, intento el siguiente código para generar la firma,

public static String GETHMACSHA1(String value, String key) throws UnsupportedEncodingException, NoSuchAlgorithmException, InvalidKeyException { String type = "HmacSHA1"; SecretKeySpec secret = new SecretKeySpec(key.getBytes(), type); Mac mac = Mac.getInstance(type); mac.init(secret); byte[] bytes = mac.doFinal(value.getBytes()); return bytesToHex(bytes); } private final static char[] hexArray = "0123456789abcdef".toCharArray(); private static String bytesToHex(byte[] bytes) { char[] hexChars = new char[bytes.length * 2]; int v; for (int j = 0; j < bytes.length; j++) { v = bytes[j] & 0xFF; hexChars[j * 2] = hexArray[v >>> 4]; hexChars[j * 2 + 1] = hexArray[v & 0x0F]; } return new String(hexChars); }

Paso el oauth_consumer_secret y oauth_token_secret como el parámetro para obtener la firma. Pero todavía recibe el mismo error.

¿Cómo generar la firma en Android y qué valor debo pasar para obtener el mismo?


Para Oauth, no creo que debas pasar CS y TS. Debe concatenar un conjunto de atributos y parámetros codificados en URL para construir la cadena base de la firma. consulte: devdocs.magento.com/guides/v2.0/get-started/authentication/

en otras palabras, uno de los parámetros en SHA1 será una url codificada y debe estar en un formato específico que comience con el método HTTP.

la url debe contener los parámetros anteriores antes de codificar.

Hice una autenticación Oauth similar en la API de Woocommerce para Android, consulte esta url general para obtener más información.

https://gist.github.com/Muneefm/f4c08b2aa3accd57fa890156f74e619a

en esta comprobación, el método llamado getLoginUrl() . en el que he concatenado la url.