Partage
  • Partager sur Facebook
  • Partager sur Twitter

Authentification OAuth 2.0 avec JWT

Comment mettre en place un système Oauth 2.0 avec un token JWT signé

    26 mars 2015 à 23:12:20

    Bonjour tous,

    En train de développer une application connectée à Salesforce, je dois authentifier chaque requête à l'API REST avec un access_token (ça, ça fonctionne, pas de souci).
    Pour obtenir ce jeton d'accès (en bon français...), je m'authentifie en utilisant le protocole OAuth 2.0 avec un refresh_token.

    Cependant, je ne peux pas autoriser plusieurs utilisateurs (sur différentes IPs) avec un seul refresh_token (je ne peux pas demander à chaque utilisateur de s'authentifier puisque tout le monde se connecte au même compte Salesforce) je suis donc obliger d'utiliser un autre type d'authentification par JWT.

    Mais là je bloque, je n'arrive pas à comprendre comment faire !

    Avez-vous déjà mis en place ce type d'authentification avec OAuth 2.0 ? Il faut une signature RSA SHA256, je dois enregistrer un fichier de signature numérique dans la configuration de Salesforce...
    J'ai une librairie pour manipuler les jetons JWT : php-jwt

    Merci par avance de votre aide.

    • Partager sur Facebook
    • Partager sur Twitter
      27 mars 2015 à 16:02:46

      Ok, je viens de résoudre mon problème et ça servira peut-être un jour à quelqu'un...

      Voici le code du contrôleur d'authentification qui obtient un access_token utilisable ensuite dans toutes les requêtes vers l'API REST (j'utilise Codeigniter) : 

      /**
        *
        * authentification action to get acces_token with OAuth2.0
        *
        * we use a JWT to authenticate and get an access_token
        * --in Salesforce we have to 
        * 1. create connected app
        * 2. enable OAuth
        * 3. check and import a public certificat paired with the private key
        * --in this app
        * 1. update private key in config/constants
        * 2. update the iss (client_id)
        * 3. update the prn (login email to Salesforce)
        *
        */
        public function oauth(){
      
        	//if we are already authentificated
        	$redirect = false;
        	if(Permissions_model::oauthAccess($redirect)){
      
        		//redirect to app login page
      	    //we are authenticated
      	    redirect('login');
      	    exit;
      
        	}
      
        	//the login url to get tokens
          $token_url = LOGIN_URI . "/services/oauth2/token";
      
      	  //get the private key paired with the public certificat uploaded in Salesforce
      	  $key = AST_OAUTH_PRIVATE_KEY;
      
      	  //required details for Salesforce
      	  $claims = array(
      	  	'iss' => AST_OAUTH_CLIENT_ID, //oauth client_id for the connected app
      	  	'prn' => AST_SF_USER_LOGIN, //email used by Salesforce user to connect to Salesforce
      	  	'aud' => LOGIN_URI,
      	  	'exp' => time()
      	  );
      	  
      	  //form the encodeed signed JWT
      	  $this->load->library('JWT');
      	  $jwt = JWT::encode($claims, $key, 'RS256'); //SHA 256 with RSA encryption
      
      	  //the grant_type is specific to require access_token from JWT auth
      	  $params = 'grant_type=urn:ietf:params:oauth:grant-type:jwt-bearer&assertion=' . $jwt;
              
          //get the response
          $curl = curl_init($token_url);
          curl_setopt($curl, CURLOPT_HEADER, false);
          curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
          curl_setopt($curl, CURLOPT_POST, true);
          curl_setopt($curl, CURLOPT_POSTFIELDS, $params);
          curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);
      
          $json_response = curl_exec($curl);
      
          $status = curl_getinfo($curl, CURLINFO_HTTP_CODE);
      
          if ( $status != 200 ) {
              exit('Erreur: l\'appel à l\'URL de génération de jeton' . $token_url . 'a échoué. Statut de l\'erreur : ' . $status . '. Réponse : ' . $json_response . '. Erreur curl : ' . curl_error($curl) . '. N° d\'erreur curl : ' . curl_errno($curl));
          }
      
          curl_close($curl);
      
          $response = json_decode($json_response, true);
      
          $access_token = $response['access_token'];
          $instance_url = $response['instance_url'];
      
          if (!isset($access_token) || $access_token == "") {
              exit("Erreur : access_token manquant de la réponse !");
          }
      
          if (!isset($instance_url) || $instance_url == "") {
              exit("Erreur : instance_url manquante de la réponse !");
          }
      
          //we store access_token and instance_url in a session to reuse after
          $this->session->set_userdata('access_token', $access_token);
          $this->session->set_userdata('instance_url', $instance_url);
      
          //redirect to app login page
          //we are authenticated
          redirect('login');
          exit;
      
        }

      J'utilise cette librairie appelée via la méthode

      JWT::encode()


       pour générer le JWT.

      Bonne journée à vous tous.

      Matthieu

      -
      Edité par MatthieuR 27 mars 2015 à 16:04:09

      • Partager sur Facebook
      • Partager sur Twitter

      Authentification OAuth 2.0 avec JWT

      × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
      × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
      • Editeur
      • Markdown