Search code examples
oauth-2.0microsoft-graph-apisingle-sign-onazure-ad-graph-apioutlook-web-addins

Error getting SSO in Outlook 365 web addin 13005. Preauthorization missing


I am working upon an outlook add-in and I am trying to get SSO token to call Graph API. I am referring this link to develop my addin Outlook addin SSO. I registered my App in Azure AD (multi-tenant). and followed everything step by step

I added version override to Manifest

  <Id>Client_id-xxx-xxx</Id>
  <Resource>api://localhost:44361/Client_id-xxx-xxx</Resource>
  <Scopes>
    <Scope>openid</Scope>
    <Scope>offline_access</Scope>
    <Scope>profile</Scope>
    <Scope>Files.ReadWrite</Scope>
    <Scope>Mail.Read</Scope>
    <Scope>User.Read</Scope>
    <Scope>email</Scope>
  </Scopes>
</WebApplicationInfo>

authconfig.js

var authConfig = {
    
    clientId:"Client_id-xxx-xxx",
    scopes: "Files.ReadWrite Mail.Read openid offline_access profile email User.Read",
    redirectUrl: "https://localhost:44361/MessageRead.html"
};

Web.config

<appSettings>
    <add key="ida:AppId" value="Client_Id_xx-xx" />
    <add key="ida:Audience" value="Client_id_xx_xx" />
    <add key="ida:AppPassword" value="app_Password" />
    <add key="ida:RedirectUri" value="https://localhost:44361/MessageRead.html" />
    <add key="ida:Authority" value="https://login.microsoftonline.com/common/oauth2/v2.0" />
  </appSettings>

I have granted the admin consent to all users in the tenant as well. (see attachment) admin consent granted

My javascript code :

Office.initialize = function (reason) {
     //   console.log("In Office.initialize ", reason);
        $(document).ready(function () {
       //     console.log("In Office.ready ");
            if (OfficeHelpers.Authenticator.isAuthDialog()) return;
            var element = document.querySelector('.ms-MessageBanner');
            messageBanner = new fabric.MessageBanner(element);
            messageBanner.hideBanner();

            authenticator = new OfficeHelpers.Authenticator();
            authenticator.endpoints.registerMicrosoftAuth(authConfig.clientId, {
                redirectUrl: authConfig.redirectUrl,
                scope: authConfig.scopes
            });

            //loadProps();

        });
    };

    function GetSSOToken(DataObj) {
            var attachmentIds = getAttechamentIdList();
            //if (Office.context.auth !== undefined && Office.context.auth.getAccessToken !== undefined) {
            if (OfficeRuntime.auth !== undefined && OfficeRuntime.auth.getAccessToken !== undefined) {
            
                OfficeRuntime.auth.getAccessToken().then(function (result) {
                    if (result.status === "succeeded") {
                       
                        // No need to prompt user, use this token to call Web API 
                        saveEmailWithSSO(result.value, attachmentIds, DataObj);
                    } else if (result.error.code == 13007 || result.error.code == 13005) {
                        console.log('error:', result.error.code);
                        // These error codes indicate that we need to prompt for consent
                        // Office.context.auth.getAccessTokenAsync({ forceConsent: true }, function (result) {
                        
                        OfficeRuntime.auth.getAccessToken({ allowConsentPrompt: true, allowSignInPrompt: true }, function (result) {
                            if (result.status === "succeeded") {
                                console.log('AccessToken:', result.value);
                                saveEmailWithSSO(result.value, attachmentIds, DataObj);
                            } else {
                                // Could not get SSO token, proceed with authentication prompt
                                console.log('in with prompt else1 ');
                                // console.log('error:', result.error.code);
    
                                saveEmailWithPrompt(attachmentIds);
    
                               
                            }
                        });
                    } else {
                        // Could not get SSO token, proceed with authentication prompt
                      
                        console.log('in with prompt else2 ');
                        console.log('error:', result.error.code);
                        saveEmailWithPrompt(attachmentIds);
    
                    }
                }).catch(function (error) {
                    console.log('in catch', error);  
                });
            } 

the above code is always ending up in Catch block with error 13005, Missing Preauthorization, Missing grant for this addin.

I have referred and made changes from this link also https://github.com/OfficeDev/office-js/issues/923 even the similar questions here could not resolve it. Please suggest what else could be done to resolve.

I am trying to run this code with a global admin's outlook account and another user from outside tenant. but not working in both the cases.

------update----

After some work around I am able to see this issue in sign in (while using forceConsent allowConsentPrompt) AADSTS90008I can see this error


Solution

  • Solved ! After hours of brainstorming , I am able to resolve this error by revisting the document again. I overlooked step 12 of https://learn.microsoft.com/en-us/office/dev/add-ins/develop/register-sso-add-in-aad-v2enter image description here