• 0
FedeS

[Resuelto] Problema con access token en aplicacion con cuentas multiples

Question

Buen día.

Hace varios años que vengo utilizando la API y nunca tuve el problema con el que me acabo de encontrar.

Todas mis aplicaciones siempre se usaron con 1 sola cuenta de MercadoLibre y nunca tuve problema obteniendo el access y el refresh.

Ahora me encuentro desarrollando una "tienda" donde mas de 1 cuenta de MercadoLibre se puede conectar y utilizarla, por lo tanto cuando agregué la segunda cuenta obtuve el access token desde "http://developers.mercadolibre.com/products-authentication-authorization/" y lo utilize para iniciar a usar esta nueva cuenta en mi tienda.

Hasta ahi todo bien, funcionaba perfecto... get, post, etc...

Luego, generé un código el cual renueva los access tokens cada 5 horas (ya que duran 6 horas) para las dos cuentas conectadas.

El problema es que cuando renueva los tokens, solo sigue funcionando el de la primera cuenta (la que siempre utilizé y donde esta creada la aplicación), y la segunda ya no funciona! cuando quiero hacer un post me dice "Action not allowed" y solo vuelve a funcionar si vuelvo a la pagina de developers y genero un nuevo access desde alli.

No entiendo cual es el problema, una cuenta funciona y la otra no! ya probé de todo y no puedo encontrar la solución.

Dejo aquí los arrays que se muestran cuando hago renovación de tokens para las dos cuentas. La primera sigue funcionando, la otra no... (puede tener algo que ver que en ambas me muestra el mismo user_id de la primera cuenta? porque sucede esto?)

Array
(
    [access_token] => APP_USR-205314098******-052302-d5ffc56f******6af7aa21f2150-96372***
    [token_type] => bearer
    [expires_in] => 21600
    [scope] => offline_access read write
    [user_id] => 96372***
    [refresh_token] => TG-5b04df09e4b0******-96372***
)

Array
(
    [access_token] => APP_USR-205314098******-052302-0d9bc97fd******6999c49b6e72d3c-96372***
    [token_type] => bearer
    [expires_in] => 21600
    [scope] => offline_access read write
    [user_id] => 96372***
    [refresh_token] => TG-5b04fc27e4b0******-96372***
)

(Por seguridad oculte algunos numeros)

El refresh lo hago de la siguiente manera para ambas cuentas, lo unico que cambia es el refresh de cada una.

$refreshml = $meli->post("/oauth/token?grant_type=refresh_token&client_id=".$data['apikey']."&client_secret=".$data['secretkey']."&refresh_token=".$data['refresh']);

 

Edited by FedeS

Share this post


Link to post
Share on other sites

5 answers to this question

Recommended Posts

  • 0

Alguien que me tire una mano?

Lei en otros posts que tiene que estar activo el offline_access... el cual está activo en mi aplicación y puede verse tambien en el json del refresh "

[scope] => offline_access read write"

Share this post


Link to post
Share on other sites
  • 0

Fede, te pido 2 cosas:

1_ Hacé un print-screen de la configuracion de la aplicacion en el Application Manager, asi podemos validar que tenes bien configurado (borrá las urls y los application id y secret key)

2_ El caso que te da error... podras explicarlo mas? indicar todo lo que puedas las variables que el pasas a la api

 


 

Share this post


Link to post
Share on other sites
  • 0

Adjunto lo solicitado.

Voy a tratar de volver a detallar nuevamente el problema, de la forma mas clara posible.

Yo tengo una app id (digamos "123456") y una secret key (digamos "sk123ml").

Esta aplicación la tengo creada en una cuenta de meracadolibre (digamos "cuenta1")

Hace varios años que utilizo la api en mi pagina web para control de stock, publicaciones, preguntas, etc... conectando mi cuenta1 con mi app 123456 y mi secret sk123ml.

Hasta ahí, todo perfecto. Nunca tuve ningun problema, tengo un cron que actualiza el access token cada 5 horas, de la siguiente manera:

$meli = new Meli($data['apikey'], $data['secretkey'], $data['access'], $data['refresh']);

$refreshml = $meli->post("/oauth/token?grant_type=refresh_token&client_id=".$data['apikey']."&client_secret=".$data['secretkey']."&refresh_token=".$data['refresh']);
$rfarray = json_decode(json_encode($refreshml['body']), true);

if ($refreshml['httpCode'] == 200) {
                $refresh = dbquery("UPDATE ml_accounts SET access='".$rfarray['access_token']."', refresh='".$rfarray['refresh_token']."', expires='".(time() + $rfarray['expires_in'])."' WHERE id='".$data['id']."'");
}

Las variables serían:

$data['id'] = "1"; // es el id de la cuenta1 en mi base de datos (no es el id de la cuenta de mercadolibre)
$data['apikey'] = "123456";
$data['secretkey'] = "sk123ml";
$data['access'] = "..."; // el access actual
$data['refresh'] = "..."; // el refresh actual

Ok, entonces como dije, hasta ahí 0 problemas. Todo funciona perfectamente hace varios años.

 

El problema se presenta cuando yo agrego una cuenta2, para que desde la misma web se pueda manejar todo lo que sucede en ambas cuentas.

Por lo tanto, busque mi primer access token desde la pagina de developers (adjunto foto) y lo cargue "manualmente" en mi base de datos.
Obviamente le di acceso a la aplicación con la cuenta2 de mercadolibre, tiene los permisos necesarios para acceder a esa cuenta.

Paso siguiente: fui a mi web, probe hacer varios get y post con esta cuenta nueva y todo funcionaba perfectamente.

Hasta que finalmente, 5 horas despues, llego la hora de actualizar los access de ambas cuentas...


La primera cuenta actualizo sus tokens con las mismas variables mas arriba, y siguio funcionando con normalidad, como siempre...

La segunda cuenta actualizo sus tokens con estas variables:

$data['id'] = "2"; // es el id de la cuenta2 en mi base de datos (no es el id de la cuenta de mercadolibre)
$data['apikey'] = "123456"; // mismo de la cuenta1, ya que es la misma aplicacion
$data['secretkey'] = "sk123ml"; // mismo de la cuenta1, ya que es la misma aplicacion
$data['access'] = "..."; // el access actual de la cuenta2
$data['refresh'] = "..."; // el refresh actual de la cuenta2

Como respuesta, obtuve lo siguiente para la cuenta1 y cuenta2 respectivamente:

Array
(
    [access_token] => APP_USR-205314098******-052302-d5ffc56f******6af7aa21f2150-96372***
    [token_type] => bearer
    [expires_in] => 21600
    [scope] => offline_access read write
    [user_id] => 96372***
    [refresh_token] => TG-5b04df09e4b0******-96372***
)

Array
(
    [access_token] => APP_USR-205314098******-052302-0d9bc97fd******6999c49b6e72d3c-96372***
    [token_type] => bearer
    [expires_in] => 21600
    [scope] => offline_access read write
    [user_id] => 96372***
    [refresh_token] => TG-5b04fc27e4b0******-96372***
)

Ok, ambas cuentas me devolvieron un nuevo access y un nuevo refresh (ambos diferentes), los actualize en mi base de datos respectivamente para cada cuenta.

Ahora cuando quiero hacer un post, solo funciona la cuenta1 (la que siempre funciono) y la cuenta2 ya no funciona, es como que el access que me da es incorrecto, cuando quiero hacer un post me dice "Action not allowed" con httpCode 403. PERO, si vuelvo a generar un access en la pagina de developers y lo vuelvo a cargar "manualmente" en mi base de datos... la cuenta2 funciona perfectamente...

No entiendo que estoy haciendo mal, ni cual es la diferencia de porque una cuenta funciona y la otra no con esos nuevos access generados.

 

app1.PNG

 

app2.PNG

access.PNG

Edited by FedeS

Share this post


Link to post
Share on other sites
  • 0

Ya pude resolverlo.

Aparentemente el error fue que cuando le di permiso a la aplicacion con la nueva cuenta lo hice a través del mismo navegador donde tenía conectada la primera cuenta (pero en modo incognito logeando con la nueva cuenta), y por alguna razón la api me daba un nuevo access para la primera cuenta, pero con el refresh de la segunda cuenta... (por eso en los dos refresh el user_id era el de la primera cuenta).

Conclusión... probé darle permiso desde otro pc (por las dudas de que no sea un tema de navegador, sino de IP, sesion, o algo parecido) y luego cuando hice refresh ya me generó uno nuevo con el user_id de la segunda cuenta y funciona normalmente.

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now