Skip to main content
cancel
Showing results for 
Search instead for 
Did you mean: 

Earn a 50% discount on the DP-600 certification exam by completing the Fabric 30 Days to Learn It challenge.

Reply
Anonymous
Not applicable

Refresh embed token using javascript

Hi All,

 

I am generating embed token if expired using javascript using below is complete code:

 

var url = "https://app.powerbi.com/groups/5036f206-3d0e-46b8-8e3e-a54a8b35dd19/reports/447a6395-0ab8-46aa-9afa-aa67e11633eb/ReportSection9fdfd7dd0814177238c5"
        var embedurl = "https://app.powerbi.com/reportEmbed?reportId=b4fc3b95-a1c4-462c-8ce4-3d6c0de928af&autoAuth=true&groupId=02a09d2e-96ea-480a-a402-a68d42f51e49";
        

        var urlParams = url.split('/');
        var groupId = urlParams[4];
       
        var reportID = urlParams[6];
        console.log(groupId,"&&", reportID);

        
        
        $(document).ready(function () {
            embedReportAndSetTokenListener(false, reportID, groupId, this.datasetId, "Create", "https://api.powerbi.com/beta/myorg/", embedurl);
        });
        function generateEmbedToken(reportID, groupID) {
            var apiUrl = "https://api.powerbi.com/v1.0/myorg/groups/" + groupID + "/reports/" + reportID + "/GenerateToken"
            var bearerToken = "Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiIsIng1dCI6IkhsQzBSMTJza3hOWjFXUXdtak9GXzZ0X3RERSIsImtpZCI6IkhsQzBSMTJza3hOWjFXUXdtak9GXzZ0X3RERSJ9.eyJhdWQiOiJodHRwczovL2FuYWx5c2lzLndpbmRvd3MubmV0L3Bvd2VyYmkvYXBpIiwiaXNzIjoiaHR0cHM6Ly9zdHMud2luZG93cy5uZXQvYzQyNjExM2UtZDNjZS00YWRiLWJiOTEtYzUzYjM3YzU4ZjE0LyIsImlhdCI6MTU4MDQ2NTQwNywibmJmIjoxNTgwNDY1NDA3LCJleHAiOjE1ODA0NjkzMDcsImFjY3QiOjAsImFjciI6IjEiLCJhaW8iOiI0Mk5nWU5pemJ5MmpnM2pSMWRmdVd1NFhjM0o3TjBXMzcvajZPU01xdkdwYVdGbmxjMGtBIiwiYW1yIjpbInB3ZCJdLCJhcHBpZCI6IjdmNTlhNzczLTJlYWYtNDI5Yy1hMDU5LTUwZmM1YmIyOGI0NCIsImFwcGlkYWNyIjoiMiIsImZhbWlseV9uYW1lIjoiUmVwb3J0cyIsImdpdmVuX25hbWUiOiJQSE0iLCJpcGFkZHIiOiIxMDYuMTk3LjE5OS4xMDMiLCJuYW1lIjoiUEhNIFJlcG9ydHMiLCJvaWQiOiJhMjBkNTZkMi05MjlkLTQ2NTctOTY2Ny05NjRhNzU0YTM0ODQiLCJvbnByZW1fc2lkIjoiUy0xLTUtMjEtMjA0MTg1ODIxNS0yODY0NjY5MTUwLTM2ODc0NzYyNS0xNjYyOSIsInB1aWQiOiIxMDAzN0ZGRUE5M0ZFOTI2Iiwic2NwIjoidXNlcl9pbXBlcnNvbmF0aW9uIiwic3ViIjoiY29mOFFBcFJWTEpVWnowZnozTHhvbUFVWmdqM2FMWWxINFdUbnFJMVdyayIsInRpZCI6ImM0MjYxMTNlLWQzY2UtNGFkYi1iYjkxLWM1M2IzN2M1OGYxNCIsInVuaXF1ZV9uYW1lIjoiUEhNLlJlcG9ydHNASEVBTFRIRUMuQ09NIiwidXBuIjoiUEhNLlJlcG9ydHNASEVBTFRIRUMuQ09NIiwidXRpIjoid2xmZE5aakVoMGFhVlpKMkFlaHVBQSIsInZlciI6IjEuMCJ9.vb0qae_Dkzw_oT4_1YsxHc-UCBGhGoYTMPN5BX0t8f8skLMZUiSupqiQkh-oms2Rg-14qk_jIEvpq9mhZt4HJEJ0w94Tn-RD8GToDlJ0bjRLEkskkUrnLUgudlT-Qa0etD3fyINMgaUVRiN2uNfP2Umipi1gBpVu6-B7HMtRVz2gDIHQBS6_gu8FNYzZMe7Ktc6DAfMPgYW3RUWIeMoiwMFr-u_eTHQheh70xnidkFrw-3L1CGqvh4tZyd3TbiURp3UlXVtM5awg75b4zKLth1_Y0Z-ROOmYh9geo24ytG8i3RxfgnlNgwBfHvrL1jvuysTDNHotbZgQgjNslS7Y4Q";
            $.ajax({
                type: "POST",
                url: apiUrl,
                headers: {
                    "Content-Type": "application/json",
                    "Authorization": 'Bearer ${this.bearerToken}'
                },
                body: {
                    "accessLevel": "View",
                    "datasetId": this.datasetId
                },
                success: function (response) {
                   console.log('Token accessed');
                },
                failure: function(xhr, status, error){
                    console.log(error);
                },
                error: function (response) {
                    console.log(response);
                }
            });
            return false;
        }
        function embedReportAndSetTokenListener(setAccessToken, reportId, groupId, datasetId, accessLevel, baseUri, embedUrl){
        // Generate embed token
        generateEmbedToken(reportId, groupId).then(function(Token) {
            var embedToken = Token.token;
        
            // set config for embedding report
            var config = createConfig(embedToken,embedUrl,reportId);
        
            // Get a reference to the embedded report HTML element
            var embedContainer = $('#embedContainer')[0];
        
            // Embed the report and display it within the div container.
            var report = powerbi.embed(embedContainer, config);
        
            // Report.off removes a given event handler if it exists.        
            report.off("loaded");

            // Report.on will add an event handler which prints to Log window.
            report.on("loaded", function() {
                // Set token expiration listener
                setTokenExpirationListener(Token.expiration, 2 /*minutes before expiration*/, reportId, groupId);
            });
        });
    }

        function setTokenExpirationListener(tokenExpiration, 
minutesToRefresh, 
reportId, 
groupId){
    // get current time
    var currentTime = Date.now();
    var expiration = Date.parse(tokenExpiration);
    var safetyInterval = minutesToRefresh* 60 * 1000;

    // time until token refresh in milliseconds
    var timeout = expiration - currentTime - safetyInterval;

    // if token already expired, generate new token and set the access token
    if (timeout<=0)
    {
        console.log("Updating Report Embed Token");
        updateToken(reportId, groupId);
    }
        // set timeout so minutesToRefresh minutes before token expires, token will be updated
    else 
    {
        console.log("Report Embed Token will be updated in " + timeout + " milliseconds.");
        setTimeout(function() {
            updateToken(reportId, groupId);
        }, timeout);
    }
}

                function updateToken(reportId, groupId) {
                    // Generate new EmbedToken
                    generateEmbedToken(reportId, groupId)
                    .then(function( Token ) {
                        // Get a reference to the embedded report HTML element
                        var embedContainer = $('#embedContainer')[0];

                        // Get a reference to the embedded report.
                        var report = powerbi.get(embedContainer);

                        // Set AccessToken
                        report.setAccessToken(Token.token)
                        .then(function() {
                            // Set token expiration listener
                            // result.expiration is in ISO format
                            setTokenExpirationListener(Token.expiration,2 /*minutes before expiration*/);
                        });
                    });
                }

  When i run application getting error like ypeError: generateEmbedToken(...).then is not a function
at embedReportAndSetTokenListener.

 

How could i fix this issue, Please suggest.

 

2 REPLIES 2
AndreiPopa
New Member

First of all, you're passing in the "Bearer " string to the authorisation header twice, so I don't think your token refresh would work. Also you probably don't need to scope it with `this.`. 

var bearerToken = "Bearer ..."

...

     "Authorization": 'Bearer ${this.bearerToken}'


The second part is your generateEmbedToken is expected to return a Promise, but all it does is execute an ajax call, so the error is saying that there is no `.then()` function on a boolean.

Hope this helps.

nnm
Frequent Visitor

Were you able to find any solution.

If yes please post here, I am looking for the same thing.

Helpful resources

Announcements
PBI_APRIL_CAROUSEL1

Power BI Monthly Update - April 2024

Check out the April 2024 Power BI update to learn about new features.