• 0
Thomas

Delphi 7 - Token Autenticação

Question

Não é uma pergunta, mas compartilhando como conseguir token de autorização com delphi 7 e  indy.

// Retorna Token de Acesso de Mercado Livre
function RetornaTokenAcessoMeLi : String;
var
  Resposta : String;
  Params : TStringList;

  // Retorna Token de Acesso de Mercado Livre, de JSON de resposta de requisição
  function RetornaToken(JSON : String) : String;
  var
    js : TlkJSONobject;
    Token : string;
  begin
     try
        js := TlkJSON.ParseText(JSON) as TlkJSONobject;
        Result := js.getString('access_token');
     except
        Result := '';
     end;
  end;

begin
   Params := TStringList.create;
   Params.add('client_id=' + IDAplicacaoMeLi);
   Params.add('client_secret=' + SecretKeyMeli);
   Params.add('grant_type=client_credentials');
   IdHTTPMercadoLivre.Request.ContentType := 'application/x-www-form-urlencoded';
   try
      Resposta := IdHTTPMercadoLivre.Post('https://api.mercadolibre.com/oauth/token', Params);
      Result := RetornaToken(Resposta);
   finally
      Params.Free;
   end;
end;

Crédito da página como consegui elaborar o código:

https://stackoverflow.com/questions/38833651/using-indy-to-retrieve-revcontent-oauth-token

Tem que ter os componentes TidHTTP e TIdSSLIOHandlerSocketOpenSSL declarados na função ou então arrastados os componentes no formulário.

 

Share this post


Link to post
Share on other sites

6 answers to this question

Recommended Posts

  • 1

Você esta seguindo o exemplo dele ?

Depois do

    Resposta := IdHTTPMercadoLivre.Post('https://api.mercadolibre.com/oauth/token', Params);

voce pode por

   Obj := TJsonObject.ParseJSONValue(Resposta) as TJsonObject;

e depois para ler esses dados

 

 [...]

var
    AT              : string;
    EI              : TDateTime;
    RT              : string;

 [...]

    AT := Obj.GetValue('access_token').Value;
    EI := incSecond(Now, Obj.GetValue('expires_in').Value.ToInteger);
    RT := Obj.GetValue('refresh_token').Value;

 

Praticamente tudo que voce faz depois precisa do access_token entao mantenha a variavel a mao no programa

Agora é com você

Share this post


Link to post
Share on other sites
  • 0

Mano que foda vélho, eu tava usando um navegador embutido, para redirecionar a pagina, depois pegar o token vindo da URL, tava fazendo puta trampo kkkk

Para usar o TlkJSONobject vc teve que instalar uma lib certo ?

Edited by Felipe Porcino

Share this post


Link to post
Share on other sites
  • 0

Adaptei seu exemplo para a forma que estou usando.

 

uses

    REST.JSON;

// Primeiro declaro o objeto que recebera o json de retorno
TDados = class
private
  FAccess_token:String;
  FToken_type:String;
  FExpires_in:Integer;
  FScope:String;
  FUser_id:Integer;
  FRefresh_token:String;
public
  property Access_token : String read FAccess_token write FAccess_token;
  property Token_type : String read FToken_type write FToken_type;
  property Expires_in : Integer read FExpires_in write FExpires_in;
  property Scope : String read FScope write FScope;
  property User_id : Integer read FUser_id write FUser_id;
  property Refresh_token : String read FRefresh_token write FRefresh_token;
end;

 

// Ai a função em si

function TForm6.RetornaTokenAcessoMeLi : String;
var
  Resposta : String;
  Params : TStringList;
  dados     : TDados;

begin
   Params := TStringList.create;
   Params.add('client_id=' +  IDAplicacaoMeLi);
   Params.add('client_secret=' + SecretKeyMeli);
   Params.add('grant_type=client_credentials');
   IdHTTPMercadoLivre.Request.ContentType := 'application/x-www-form-urlencoded';
   try

    Resposta := IdHTTPMercadoLivre.Post('https://api.mercadolibre.com/oauth/token', Params);
      try
        dados     := TDados.Create;
        dados     := TJSON.JsonToObject<TDados>(Resposta);
        Result    := dados.Access_token;
      except
        Result := '';
      end;
   finally
      Params.Free;
   end;
end;

 

 

Edited by Felipe Porcino

Share this post


Link to post
Share on other sites
  • 0
On 02/10/2017 at 9:49 AM, Felipe Porcino said:

Adaptei seu exemplo para a forma que estou usando.

 

uses

    REST.JSON;

// Primeiro declaro o objeto que recebera o json de retorno
TDados = class
private
  FAccess_token:String;
  FToken_type:String;
  FExpires_in:Integer;
  FScope:String;
  FUser_id:Integer;
  FRefresh_token:String;
public
  property Access_token : String read FAccess_token write FAccess_token;
  property Token_type : String read FToken_type write FToken_type;
  property Expires_in : Integer read FExpires_in write FExpires_in;
  property Scope : String read FScope write FScope;
  property User_id : Integer read FUser_id write FUser_id;
  property Refresh_token : String read FRefresh_token write FRefresh_token;
end;

 

// Ai a função em si

function TForm6.RetornaTokenAcessoMeLi : String;
var
  Resposta : String;
  Params : TStringList;
  dados     : TDados;

begin
   Params := TStringList.create;
   Params.add('client_id=' +  IDAplicacaoMeLi);
   Params.add('client_secret=' + SecretKeyMeli);
   Params.add('grant_type=client_credentials');
   IdHTTPMercadoLivre.Request.ContentType := 'application/x-www-form-urlencoded';
   try

    Resposta := IdHTTPMercadoLivre.Post('https://api.mercadolibre.com/oauth/token', Params);
      try
        dados     := TDados.Create;
        dados     := TJSON.JsonToObject<TDados>(Resposta);
        Result    := dados.Access_token;
      except
        Result := '';
      end;
   finally
      Params.Free;
   end;
end;

 

 

Olá Felipe.

Estou começando esses estudos mas não manjo muito de Delphi com REST, etc.

Fiz uns testes com autenicação em PHP apesar de nunca ter usado PHP e até deu certo, mas preciso mesmo é no D.

Fiz o seu exemplo e quando peço pra autenticar dá o erro 'IOHandler value is not valid'.

Eu uso o XE6 e coloquei apenas o componente idHTTP apenas e a uses JSON.

Tem algo que eu deva configurar a mais? 

 

Agradeço qualquer ajuda.

 

Complementando: adicionei o IdSSLIOHandlerSocketOpenSSL1 para o idHTTP e coloquei as DLL's do openSSL na pasta da aplicação.

Agora não dá mais erro e obtenho um string.

Essa string é o token de retorno? Com ela é que tenho a autorização para as operações?

Me desculpem  as perguntas meio toscas mas realmente nessa parte sou meio cru. E o chefe inventou de vender no ML, aí...

 

 

 

Edited by OldProgramer

Share this post


Link to post
Share on other sites
  • 0

É isso aí gbandoni, fiz a consulta aos dados privados e foi beleza. Também fiz a criação do usuário de teste e foi beleza.

Agora vou continuar os testes com a criação de anúncios e tal.

Grato.

Share this post


Link to post
Share on other sites
  • 0
On 10/2/2017 at 9:49 AM, Felipe Porcino said:

Adaptei seu exemplo para a forma que estou usando.

 

uses

    REST.JSON;

// Primeiro declaro o objeto que recebera o json de retorno
TDados = class
private
  FAccess_token:String;
  FToken_type:String;
  FExpires_in:Integer;
  FScope:String;
  FUser_id:Integer;
  FRefresh_token:String;
public
  property Access_token : String read FAccess_token write FAccess_token;
  property Token_type : String read FToken_type write FToken_type;
  property Expires_in : Integer read FExpires_in write FExpires_in;
  property Scope : String read FScope write FScope;
  property User_id : Integer read FUser_id write FUser_id;
  property Refresh_token : String read FRefresh_token write FRefresh_token;
end;

 

// Ai a função em si

function TForm6.RetornaTokenAcessoMeLi : String;
var
  Resposta : String;
  Params : TStringList;
  dados     : TDados;

begin
   Params := TStringList.create;
   Params.add('client_id=' +  IDAplicacaoMeLi);
   Params.add('client_secret=' + SecretKeyMeli);
   Params.add('grant_type=client_credentials');
   IdHTTPMercadoLivre.Request.ContentType := 'application/x-www-form-urlencoded';
   try

    Resposta := IdHTTPMercadoLivre.Post('https://api.mercadolibre.com/oauth/token', Params);
      try
        dados     := TDados.Create;
        dados     := TJSON.JsonToObject<TDados>(Resposta);
        Result    := dados.Access_token;
      except
        Result := '';
      end;
   finally
      Params.Free;
   end;
end;

 

 

Felipe, onde vc ta declarando essa classe dentro da unit? E dentro de algum form ou uma unit separada? Me parece que é dentro da unit desse form6 correto? Mas em que lugar especificamente? Manda o código completo do form/unit ai pra gente?

Edited by Linces Marques

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