• 0
MARCIO TENREIRO

refresh token retornando "Error validating grant. Your authorization code or refresh token may be expired or it was already used."

Question

Estou desenvolvendo uma aplicação onde o  cliente irá interagir somente na autorização da aplicação e até ai está funcionando normalmente. O usuário acessa meu sistema em PHP, é redirecionado para a tela de autorização e no retorno eu gravo o código de autorização , o access token e o token_refresh; Dai em diante ele trabalha normalemete, Se preciso dar um refresh_token atraves de vosso SDK, ele me retorna a mensagem dizendo: Error validating grant. Your authorization code or refresh token may be expired or it was already used.

A principio achei que eu pudesse estar utilizando em algum operação de refresh_token anteriormente mas nao estou. Loguei manualmente hoje de manha, recebi os dados, armazenei em BD e desliguei o pc. Depois de 6 horas eu liguei o pc e tentei dar um refresh token e aparece a mesma mensagem. O que posso estar fazendo de errado ou existe algum problema com a API?

Não quero ter que ficar pedindo para o cliente autorizar toda vez a aplicação. Quero que seja feito de forma automática pela minha aplicação, mas desse jeito fica difícil.

 

Agradeço a todos e obrigado pela atenção

 

Segue o código de minha aplicação, lembrando que a parte de login está OK..

<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');

require_once(APPPATH . 'libraries/meli.php');

class Mercadolivre {
        
        private $APP_ID       = "***";
        private $SECRET_KEY   = "***";                                
        private $URL_CALLBACK = '***';
        
        private $MELI = null;
        
        /* -------------- */
        private $ACCESS_TOKEN       = null;
        private $TOKEN_REFRESH      = null;
        private $TOKEN_RENOVACAO    = null;
        private $CODIGO_AUTORIZACAO = null;
        private $ML_ID              = null;
        
        public function __construct($ml_id) {
            $this->ML_ID = $ml_id;
            $this->set_access_token();
        }       
        
        private function set_access_token(){
            
            $CI = & get_instance();
            $CI->load->model('model');
            
            /* Busca os dados do access_token */
            $sql = $CI->model->sql('select *  
                                      from cliente_market_place
                                      where ml_id = ?
                                        and cliente_id = ?',array($this->ML_ID, cliente_id()))->row();
            
            /* Inicializa os parametros */
            $this->ACCESS_TOKEN     = null;
            $this->TOKEN_REFRESH    = null;
            $this->TOKEN_RENOVACAO  = null;   
            $this->CODIGO_AUTORIZACAO = null;
            
            if ($sql){     
                
                $this->ACCESS_TOKEN       = $sql->ml_token;
                $this->TOKEN_REFRESH      = $sql->ml_token_refresh;
                $this->TOKEN_RENOVACAO    = $sql->ml_token_data_renovacao;
                $this->CODIGO_AUTORIZACAO = $sql->ml_autorizacao;
                
                $this->MELI = new Meli($this->APP_ID,$this->SECRET_KEY,$this->ACCESS_TOKEN,$this->TOKEN_REFRESH);
                
                if (strtotime($this->TOKEN_RENOVACAO) < time()) {
                    $this->refresh_token();
                }
                
            }
            
        }       
        
        public function refresh_token(){            
            
            $request = $this->MELI->refreshAccessToken();
            
            if($request["httpCode"] == 200) {    
                
                $this->set_access_token();
                
            }elseif($request["httpCode"] == 400) {    
                /*
                 *
                 * O ERRO QUE COMENTEI
                 *
                 */
                if (trim($request['body']->message)=='Error validating grant. Your authorization code or refresh token may be expired or it was already used.'){
                   /*
                    *
                    * TERÁ QUE AUTORIZAR NOVAMENTE
                    *
                    */
                }
                
            }
            
        }
        
}

Share this post


Link to post
Share on other sites

6 answers to this question

Recommended Posts

  • 0

Rodrigo, primeiramente obrigado pelo retorno.

Como eu disse acima, não utilizei o refresh em nenhum momento. me assegurei disso.

 

A pergunta agora seria como posso refazer a autenticação sem precisar da ação do cliente?

Share this post


Link to post
Share on other sites
  • 0

Rodrigo, primeiramente obrigado pelo retorno.

Como eu disse acima, não utilizei o refresh em nenhum momento. me assegurei disso.

 

A pergunta agora seria como posso refazer a autenticação sem precisar da ação do cliente?

 

Re-autenticar sem precisar do cliente apenas usando o refresh token, no caso o cliente autentica uma vez você salva o refresh token no banco de dados, sempre que a sessao expira faz um refresh token, esta é a unica forma que pode fazer sem precisar do cliente, só que isso em teoria, em pratica para mim o refresh token a dias parou de funcionar, não sei para outros usuarios do meli.

Share this post


Link to post
Share on other sites
  • 0

Fsolari, boa tarde.

O token só está sendo atualizado depois de expirado. Já fiz esse teste também.

 

Agora conforme nosso amigo disse acima, algumas pessoas estão tendo problemas também com o refresh token que parou de funcionar. Então não é so comigo...

 

O que pode ser??

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