Office 365 Rest API - Authentification daemon de la semaine

Office 365 Rest API - Authentification daemon de la semaine


Source : Stack Overflow [office365]

Au lieu d’un client_secret dans le corps de votre requête, vous avez besoin d’un client_assertion. C’est un peu plus complexe, mais c’est la raison pour laquelle vous avez besoin de ce certificat.

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 :

En-tête :

{
  "alg": "RS256",
  "x5t": "..." // THUMBPRINT of Cert
}

Charge utile :

{
  "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"
}

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 :

base64_header.base64_payload

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 :

base64_header.base64_payload.base64_signature

Enfin, incluez ceci dans votre POST vers le point de terminaison du jeton en tant que paramètre client_assertion, et incluez également un paramètre client_assertion_type défini sur “urn:ietf:params:oauth:client-assertion-type:jwt-bearer” :

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'
  )

J’espère que cela vous aide ! Tout ceci est basé sur mes recherches sur le fonctionnement d’ADAL, et je ne l’ai pas testé moi-même en Ruby.