• 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
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

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Answer this question...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Loading...