2017-09-27 6 views
1

J'ai cherché longtemps mais je n'ai pas trouvé de solution pertinente.Comment envoyer des messages Outlook par javascript SDK?

Lorsque j'envoie un message via l'API Microsoft Graph pour obtenir 403, je ne sais pas où le problème est

{ 
    statusCode: 403, 
    code: "ErrorAccessDenied", 
    message: "Access is denied. Check credentials and try again." 
} 

code:

makeSilentTokenRequest

//The static key authentication request 
function makeSilentTokenRequest(callback) { 

    // Build up a hidden iframe 
    var iframe = $('<iframe/>'); 
    iframe.attr('id', 'auth-iframe'); 
    iframe.attr('name', 'auth-iframe'); 
    iframe.appendTo('body'); 
    iframe.hide(); 

    iframe.load(function() { 
     callback(localStorage.accessToken); 
    }); 

    iframe.attr('src', buildAuthUrl() + '&prompt=none&domain_hint=' + 
     localStorage.userDomainType + '&login_hint=' + 
     localStorage.userSigninName); 

} 

getAccessToken

//Verify refresh token function 
function getAccessToken(callback) { 
    var now = new Date().getTime(); 
    var isExpired = now > parseInt(localStorage.tokenExpires); 

    // Do we have a token already? 
    if (localStorage.accessToken && !isExpired) { 
     // Just return what we have 
     if (callback) { 
      callback(localStorage.accessToken); 
     } 
    } else { 
     // Attempt to do a hidden iframe request 
     makeSilentTokenRequest(callback); 
    } 
} 

getUserEmailAddress

function getUserEmailAddress(callback) { 
    //I saved it in localStorage 
    if (localStorage.userEmail) { 
     return localStorage.userEmail; 
    } else { 
     //getAccessToken 
     getAccessToken(function (accessToken) { 
      if (accessToken) { 
       // Create a Graph client 
       var client = MicrosoftGraph.Client.init({ 
        authProvider: (done) => { 
         // Just return the token 
         done(null, accessToken); 
        } 
       }); 
       // Get the Graph /Me endpoint to get user email address 
       client 
        .api('/me') 
        .get((err, res) => { 
         if (err) { 
          callback(null, err); 
         } else { 
          callback(res.mail); 
         } 
        }); 
      } else { 
       var error = { 
        responseText: 'Could not retrieve access token' 
       }; 
       callback(null, error); 
      } 
     }); 
    } 
} 

sendMail

//sendMail 
function sendMail(message) { 
    getUserEmailAddress(function (userEmail, error) { 
     if (error) { 
      renderError('getUserEmailAddress failed', error.responseText); 
     } else { 
      getAccessToken(function (accessToken) { 
       if (accessToken) { 
        // Create a Graph client 
        var client = MicrosoftGraph.Client.init({ 
         authProvider: (done) => { 
          // Just return the token 
          done(null, accessToken); 
         } 
        }); 
        client 
         .api('/me/sendMail') 
         .header('Authorization', 'Bearer ' + accessToken) 
         .header('Content-Type', "application/json") 
         .post(message, (err, res) => { 
          if (err) { 
           console.log(err); 
           //callback(null, err); 
          } else { 
           console.log(res); 
           //callback(res.value); 
          } 
         }); 
       } else { 
        var error = { 
         responseText: 'Could not retrieve access token' 
        }; 
        //callback(null, error); 
       } 
      }); 
     } 
    }) 
}  

CreateMail

function createMail(message,callback){ 
     getUserEmailAddress(function(userEmail, error) { 
      if (error) { 
       renderError('getUserEmailAddress failed', error.responseText); 
      } else { 
       getAccessToken(function(accessToken) { 
        if (accessToken) { 
         // Create a Graph client 
         var client = MicrosoftGraph.Client.init({ 
          authProvider: (done) => { 
           // Just return the token 
           done(null, accessToken); 
          } 
         }); 
         client 
          .api('/me/messages') 
          .header('Authorization', 'Bearer ' +accessToken) 
          .header('Content-Type', "application/json") 
          .post(message,(err, res) => { 
           if (err) { 
            callback(res); 
            console.log("创建失败!"); 
           } else { 
            callback(res); 
            console.log("创建成功!"); 
           } 
          }); 
        } else { 
         var error = { responseText: 'Could not retrieve access token' }; 
         //callback(null, error); 
        } 
       }); 
      } 
    }) 
    }  

Répondre

0

Il ne suffit pas d'aller ici, mais le message d'erreur vous dit que votre accessToken n'est pas valide.

Je ne peux pas voir quelles portées vous demandez ou quel flux de travail d'autorisation vous exécutez, donc je ne peux pas identifier précisément pourquoi il est invalide.

+0

Merci d'avance, j'ai mis la méthode d'utilisation dans le problème.J'utilise le moyen de Microsoft pour accéder à 'accessToken', et je peux obtenir la liste de diffusion normalement, mais il y a un problème lors de l'envoi de courrier. Quel est le point spécial sur lequel je dois faire attention? – ronger

+0

Nous avons donc pas mal de "Microsoft Ways" pour obtenir un accessToken. Il existe plusieurs points de terminaison (v1.0 vs v2.0) et plusieurs flux OAUTH ('authorization_code',' implicit', 'client_credentials'), sans parler de plusieurs API avec leur propre ensemble de portée (API Microsoft Graph, API Azure Graph, Exchange Web Services, API Yammer, etc., etc.). Comprendre exactement comment vous obtenez le jeton me dira pourquoi il est rejeté dans ce cas. –

+0

Merci, je ne pense pas que je l'ai fait savoir, j'utilise le [Microsoft Graph API] (https://developer.microsoft.com/fr-fr/graph/docs/api-reference/v1.0/api/user_sendmail) – ronger