Jump to content
Sign in to follow this  
felipebmfaria

Json Web Token - ZENDESK

Recommended Posts

Estou precisando de autenticar o login enviando um jwt para o Zendesk. Estou seguindo a documentação, mas ainda não consegui fazer funcionar o envio do json web token.


Depois de tentar logar recebo a mensagem de class JWT not found.


Alguém já implementou algo parecido?


O código que estou usando:


$key = "{key}";
$subdomain = "{subdomain}";
$now = time();
$token = array(
"jti" => md5($now . rand()),
"iat" => $now,
"name" => $user->name,
"email" => $user->email
);
$jwt = JWT::encode($token, $key);
$location = "https://" . $subdomain . ".zendesk.com/access/jwt?jwt=" . $jwt;
if(isset($_GET["return_to"])) {
$location .= "&return_to=" . urlencode($_GET["return_to"]);
}


Share this post


Link to post
Share on other sites

Consegui resolver.

 

verifica_login.php

 

include_once "JWT.php";
 
// Verifica se a senha do usuário está correta
if ( crypt( $dados_usuario['senha'], $fetch_usuario['user_password'] ) === $fetch_usuario['user_password'] ) {
// O usuário está logado
$_SESSION['logado']       = true;
$_SESSION['nome_usuario'] = $fetch_usuario['user_name'];
$_SESSION['usuario']      = $fetch_usuario['user'];
$_SESSION['user_id']      = $fetch_usuario['user_id'];
 
$key       = "key";
$subdomain = "subdomain";
$now       = time();
$token     = array(
 "jti"   => md5($now . rand()),
 "iat"   => $now,
 "name"  => $_SESSION['nome_usuario'],
 "email" => $_SESSION['usuario']
);
$jwt = JWT::encode($token, $key);
$location = "https://" . $subdomain . ".zendesk.com/access/jwt?jwt=" . $jwt;
header("Location: " . $location);
}

 

JWT.php

 

<?php
/**
 * JSON Web Token implementation, based on this spec:
 * http://tools.ietf.org/html/draft-ietf-oauth-json-web-token-06
 *
 * PHP version 5
 *
 * @category Authentication
 * @package  Authentication_JWT
 * @author   Neuman Vong <neuman@twilio.com>
 * @author   Anant Narayanan <anant@php.net>
 * @license  http://opensource.org/licenses/BSD-3-Clause 3-clause BSD
 * @link     https://github.com/firebase/php-jwt
 */
class JWT
{
    /**
     * Decodes a JWT string into a PHP object.
     *
     * @param string      $jwt    The JWT
     * @param string|null $key    The secret key
     * @param bool        $verify Don't skip verification process 
     *
     * @return object      The JWT's payload as a PHP object
     * @throws UnexpectedValueException Provided JWT was invalid
     * @throws DomainException          Algorithm was not provided
     * 
     * @uses jsonDecode
     * @uses urlsafeB64Decode
     */
    public static function decode($jwt, $key = null, $verify = true)
    {
        $tks = explode('.', $jwt);
        if (count($tks) != 3) {
            throw new UnexpectedValueException('Wrong number of segments');
        }
        list($headb64, $bodyb64, $cryptob64) = $tks;
        if (null === ($header = JWT::jsonDecode(JWT::urlsafeB64Decode($headb64)))) {
            throw new UnexpectedValueException('Invalid segment encoding');
        }
        if (null === $payload = JWT::jsonDecode(JWT::urlsafeB64Decode($bodyb64))) {
            throw new UnexpectedValueException('Invalid segment encoding');
        }
        $sig = JWT::urlsafeB64Decode($cryptob64);
        if ($verify) {
            if (empty($header->alg)) {
                throw new DomainException('Empty algorithm');
            }
            if ($sig != JWT::sign("$headb64.$bodyb64", $key, $header->alg)) {
                throw new UnexpectedValueException('Signature verification failed');
            }
        }
        return $payload;
    }
    /**
     * Converts and signs a PHP object or array into a JWT string.
     *
     * @param object|array $payload PHP object or array
     * @param string       $key     The secret key
     * @param string       $algo    The signing algorithm. Supported
     *                              algorithms are 'HS256', 'HS384' and 'HS512'
     *
     * @return string      A signed JWT
     * @uses jsonEncode
     * @uses urlsafeB64Encode
     */
    public static function encode($payload, $key, $algo = 'HS256')
    {
        $header = array('typ' => 'JWT', 'alg' => $algo);
        $segments = array();
        $segments[] = JWT::urlsafeB64Encode(JWT::jsonEncode($header));
        $segments[] = JWT::urlsafeB64Encode(JWT::jsonEncode($payload));
        $signing_input = implode('.', $segments);
        $signature = JWT::sign($signing_input, $key, $algo);
        $segments[] = JWT::urlsafeB64Encode($signature);
        return implode('.', $segments);
    }
    /**
     * Sign a string with a given key and algorithm.
     *
     * @param string $msg    The message to sign
     * @param string $key    The secret key
     * @param string $method The signing algorithm. Supported
     *                       algorithms are 'HS256', 'HS384' and 'HS512'
     *
     * @return string          An encrypted message
     * @throws DomainException Unsupported algorithm was specified
     */
    public static function sign($msg, $key, $method = 'HS256')
    {
        $methods = array(
            'HS256' => 'sha256',
            'HS384' => 'sha384',
            'HS512' => 'sha512',
        );
        if (empty($methods[$method])) {
            throw new DomainException('Algorithm not supported');
        }
        return hash_hmac($methods[$method], $msg, $key, true);
    }
    /**
     * Decode a JSON string into a PHP object.
     *
     * @param string $input JSON string
     *
     * @return object          Object representation of JSON string
     * @throws DomainException Provided string was invalid JSON
     */
    public static function jsonDecode($input)
    {
        $obj = json_decode($input);
        if (function_exists('json_last_error') && $errno = json_last_error()) {
            JWT::_handleJsonError($errno);
        } else if ($obj === null && $input !== 'null') {
            throw new DomainException('Null result with non-null input');
        }
        return $obj;
    }
    /**
     * Encode a PHP object into a JSON string.
     *
     * @param object|array $input A PHP object or array
     *
     * @return string          JSON representation of the PHP object or array
     * @throws DomainException Provided object could not be encoded to valid JSON
     */
    public static function jsonEncode($input)
    {
        $json = json_encode($input);
        if (function_exists('json_last_error') && $errno = json_last_error()) {
            JWT::_handleJsonError($errno);
        } else if ($json === 'null' && $input !== null) {
            throw new DomainException('Null result with non-null input');
        }
        return $json;
    }
    /**
     * Decode a string with URL-safe Base64.
     *
     * @param string $input A Base64 encoded string
     *
     * @return string A decoded string
     */
    public static function urlsafeB64Decode($input)
    {
        $remainder = strlen($input) % 4;
        if ($remainder) {
            $padlen = 4 - $remainder;
            $input .= str_repeat('=', $padlen);
        }
        return base64_decode(strtr($input, '-_', '+/'));
    }
    /**
     * Encode a string with URL-safe Base64.
     *
     * @param string $input The string you want encoded
     *
     * @return string The base64 encode of what you passed in
     */
    public static function urlsafeB64Encode($input)
    {
        return str_replace('=', '', strtr(base64_encode($input), '+/', '-_'));
    }
    /**
     * Helper method to create a JSON error.
     *
     * @param int $errno An error number from json_last_error()
     *
     * @return void
     */
    private static function _handleJsonError($errno)
    {
        $messages = array(
            JSON_ERROR_DEPTH => 'Maximum stack depth exceeded',
            JSON_ERROR_CTRL_CHAR => 'Unexpected control character found',
            JSON_ERROR_SYNTAX => 'Syntax error, malformed JSON'
        );
        throw new DomainException(
            isset($messages[$errno])
            ? $messages[$errno]
            : 'Unknown JSON error: ' . $errno
        );
    }
}

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
Sign in to follow this  

  • Similar Content

    • By brunoogm
      Pessoal, vou iniciar um desenvolvimento mobile usando Xamarin
      e gostaria de saber se alguém conhece alguma maneira
      ou tenha algum doc. de como utilizar PHP e MySql (e se necessário Json)
      para realizar um CRUD e a partir daí eu poder me entender com a plataforma...
       
      Desde já obrigado.
       
       
    • By Gilberto Jr
      Boa tarde.
       
      Eu esto com um probleminha que eu não estou conseguindo resolver.
       
      Estou lendo um json atraves de uma webservice https://jsonplaceholder.typicode.com/photos atraves do codigo abaixo.
       
      <html> <head> <title>Teste</title> <script src="https://ajax.aspnetcdn.com/ajax/jQuery/jquery-3.4.1.min.js"></script> <!-- Adicionando Javascript --> <script type="text/javascript" > $(document).ready(function(){ $("#search").click(function(){ $.ajax({ type: "GET", dataType: "json", url: "https://jsonplaceholder.typicode.com/photos", success: function(data) { for (var i in data) { //vai passar por todos os objetos dentro do array $("#title").text(data[i]["title"]); $("#id").text(data[i]["id"]); $("#albumId").text(data[i]["albumId"]); $("#thumbnailUrl").attr("src",data[i]["thumbnailUrl"]); $("#url").attr("src",data[i]["url"]); } } }); }) }); // END Function, END ready </script> </head> <body> <input type="button" placeholder="Busca" id="search" value="Buscar"> <section> <div class="container"> <div class="row" id="content"> <br/> <div id="id"></div><br/> <div id="albumId"></div><br/> <div id="title"></div><br/> <img src="" id="thumbnailUrl"><br/> <img src="" id="url"><br/> </div> </div> </section> </body> </html> Eu estou até conseguindo trazer as informações. Porem vem o ultimo dado do JSON, 
       
      E eu também, tenho que mostrar todas as informações do arquivo JSON. Fazer um for para mostrar todos os dados na tela.
       
      Mas eu não estou conseguindo, poderia me ajudar?
       
      Att;
      Gilberto Jr
    • By Regiane Primoni
      Fiz toda integração da API 3.0 da Cielo utilizando o ambiente de teste deu tudo certo, quando coloquei url e credenciais de produção retorna erro 405.
      O certificado + os 3 arquivos cielo estão instalados.
       
      O código:
      <?php
      $array = array(
          "MerchantOrderId" => "2014111703",
          "Payment" => array(
              "Type"=> "CreditCard",   
              "Amount"=> "15700",   
              "Installments"=> "1",   
              "SoftDescriptor"=> "123456789ABCD",
              "CreditCard" => array(
                  "CardNumber" => "4551870000000183",   
                  "Holder" => "Teste Holder",   
                  "ExpirationDate" => "10/2030",   
                  "SecurityCode" => "123",
                  "Brand" => "Visa"
              ),
          ), 
      );
      echo $json = json_encode($array);                                                                           
      $ch = curl_init('https://api.cieloecommerce.cielo.com.br/'); 
      curl_setopt ($ch, CURLOPT_CUSTOMREQUEST, "POST");   
      curl_setopt($ch, CURLOPT_POSTFIELDS, $json); 
      curl_setopt ($ch, CURLOPT_RETURNTRANSFER, true);  
      curl_setopt($ch, CURLOPT_HTTPHEADER, array(
          'Content-Type: application/json',
          'MerchantId: ' . '8b08ea04-951e-414e-9541-d2d19c36fdf6',
          'MerchantKey: ' . 'QJCRZAUKNODFHXBISETYIJXSTMNTAKSDVEKCISGI',
          'Content-Length: ' . strlen($json))
      );                                                                                                        
      $result = curl_exec ($ch);
      $novo = json_decode($result);
      echo "TID ". $novo->Payment->Tid;
       
      O erro:
      {"MerchantOrderId":"2014111703","Payment":{"Type":"CreditCard","Amount":"15700","Installments":"1","SoftDescriptor":"123456789ABCD","CreditCard":{"CardNumber":"4551870000000183","Holder":"Teste Holder","ExpirationDate":"10\/2030","SecurityCode":"123","Brand":"Visa"}}}
      Server Error
      405 - HTTP verb used to access this page is not allowed.
      The page you are looking for cannot be displayed because an invalid method (HTTP verb) was used to attempt access.
       
      Alguem consegue me ajudar por favor
       
    • By evandrofelipe
      Como consigo ler este retorno e jogar para dentro de uma variável?
       
      ["total"]=> int(771) ["page"]=> int(1) ["total_pages"]=> int(78) } ...
      $data = curl_exec($ch);
      $info = json_decode($data, true);
      curl_close($ch);
       
      fiz assim, mas sem sucesso:
      echo '<p>';
      echo $info['buildings']['id'];
      echo '<p>';
       
      fiz assim também e também sem sucesso:
      foreach($info as $registro)
      {$i=$i+1;
      echo $registro->url[$i].'<p>';
      }
       
      agradeço a quem poder ajudar.
    • By luannsr12
      Olá pessoal, ontem coloquei um repositório em meu GitHub , para quem deseja rastrear encomendas dos correios usando php, a chamada é bem simples, e retorna em JSON:
       
      <?php $obj = "CODIGO DE RASTREIO"; $url = "http://localhost/rastreio/api/obj.php?obj={$obj}"; $rastreio = file_get_contents($url); echo $rastreio; JSON:
      { "0": { "date":"10/06/2019", "hour":"14:14", "location":"SAO PAULO / SP", "action":"Objeto encaminhado", "message":"Objeto encaminhado de Agência dos Correios em SAO PAULO / SP para Unidade de Tratamento em SAO PAULO / SP", "change":"há 2 dias" } } https://github.com/luannsr12/correios-rastreio
      Vlw!!
×

Important Information

Ao usar o fórum, você concorda com nossos Terms of Use.