<p>Au lieu d’un <code>client_secret</code> dans le corps de votre requête, vous avez besoin d’un <code>client_assertion</code>. C’est un peu plus complexe, mais c’est la raison pour laquelle vous avez besoin de ce certificat.</p>
<p>En gros, vous devez construire un JSON Web Token et le signer avec votre certificat en utilisant un hachage SHA256. Le jeton va ressembler à ceci :</p>
<p>En-tête :</p>
<pre><code class="lang-auto">{
"alg": "RS256",
"x5t": "..." // THUMBPRINT of Cert
}
</code></pre>
<p>Charge utile :</p>
<pre><code class="lang-auto">{
"aud": "https:\/\/login.windows.net\/<The logged in user's tenant ID>\/oauth2\/token",
"exp": 1423168488,
"iss": "YOUR CLIENT ID",
"jti": "SOME GUID YOU ASSIGN",
"nbf": 1423167888,
"sub": "YOUR CLIENT ID"
}
</code></pre>
<p>Si vous suivez toujours, vous devez maintenant encoder en base64 les deux parties (séparément), puis les concaténer avec un ‘.’. Vous devriez donc maintenant avoir :</p>
<pre><code class="lang-auto">base64_header.base64_payload
</code></pre>
<p>Prenez maintenant cette chaîne et signez-la avec votre certificat, en utilisant un hachage SHA256. Puis encodez le résultat en base64, encodez-le en URL, puis ajoutez-le à la chaîne, de sorte que vous ayez maintenant :</p>
<pre><code class="lang-auto">base64_header.base64_payload.base64_signature
</code></pre>
<p>Enfin, incluez ceci dans votre POST vers le point de terminaison du jeton en tant que paramètre <code>client_assertion</code>, et incluez également un paramètre <code>client_assertion_type</code> défini sur “urn:ietf:params:oauth:client-assertion-type:jwt-bearer” :</p>
<pre><code class="lang-auto">req.set_form_data(
:grant_type => 'client_credentials',
:redirect_uri => 'http://spready.dev',
:resource => 'https://outlook.office365.com/',
:client_id => '== Client ID ==',
:client_assertion_type => 'urn:ietf:params:oauth:client-assertion-type:jwt-bearer',
:client_assertion => 'base64_header.base64_payload.base64_signature'
)
</code></pre>
<p>J’espère que cela vous aide ! Tout ceci est basé sur mes recherches sur le fonctionnement d’<a href="https://github.com/AzureAD/azure-activedirectory-library-for-dotnet">ADAL</a>, et je ne l’ai pas testé moi-même en Ruby.</p>