Hi,To send a message to Teams from a Node.js application using the Graph API, I successfully obtained the access token, receiver's chat ID, and team ID using their email. However, when attempting to send a message, I'm encountering a 401 Unauthorized err

Satya Krishna Madasu 0 Reputation points
2024-05-31T05:04:39.69+00:00

I have given the all the required permissions on both application and delegated permissions

"roles": [ "TeamMember.Read.All", "User.ReadBasic.All", "Chat.UpdatePolicyViolation.All", "Teamwork.Migrate.All", "User.ReadWrite.All", "ChatMember.ReadWrite.All", "Group.Read.All", "Team.Create", "Group.Create", "Group.ReadWrite.All", "Chat.ReadWrite.WhereInstalled", "ChatMessage.Read.All", "User.Read.All", "Chat.Read.WhereInstalled", "Files.Read.All", "Team.ReadBasic.All", "Chat.Read.All", "TeamsAppInstallation.ReadWriteForTeam.All", "Chat.ReadBasic.WhereInstalled", "Chat.ReadWrite.All", "Teamwork.Read.All", "ChatMember.ReadWrite.WhereInstalled", "Chat.ReadBasic.All", "ChatMember.Read.All", "ChatMember.Read.WhereInstalled", "Chat.Create" ],

error:
response: {     status: 401,     statusText: 'Unauthorized',     headers: Object [AxiosHeaders] {       'transfer-encoding': 'chunked',       'content-type': 'application/json',       vary: 'Accept-Encoding',       'strict-transport-security': 'max-age=31536000',       'request-id': '2e727c24-cb53-4ca9-b5eb-36db5d5fcabc',       'client-request-id': '2e727c24-cb53-4ca9-b5eb-36db5d5fcabc',       'x-ms-ags-diagnostic': '{"ServerInfo":{"DataCenter":"Central India","Slice":"E","Ring":"3","ScaleUnit":"001","RoleInstance":"PN3PEPF00000318"}}',       date: 'Thu, 30 May 2024 13:12:47 GMT',       connection: 'close'     },     config: {       transitional: [Object],       adapter: [Array],       transformRequest: [Array],       transformResponse: [Array],       timeout: 0,       xsrfCookieName: 'XSRF-TOKEN',       xsrfHeaderName: 'X-XSRF-TOKEN',       maxContentLength: -1,       maxBodyLength: -1,       env: [Object],       validateStatus: [Function: validateStatus],       headers: [Object [AxiosHeaders]],       method: 'post',       url: 'https://graph.microsoft.com/v1.0/chats/19:4a9bbe73-85df-413a-ae7f-2d60a3841b1f_71fcbd92-3485-4007-a689-95e88b221fea@unq.gbl.spaces/messages',       data: '{"body":{"content":"Hello, this is a test message from Node.js!"}}'     },     request: <ref *1> ClientRequest {       _events: [Object: null prototype],       _eventsCount: 7,       _maxListeners: undefined,       outputData: [],       outputSize: 0,       writable: true,       destroyed: true,       _last: true,       chunkedEncoding: false,       shouldKeepAlive: false,       maxRequestsOnConnectionReached: false,       _defaultKeepAlive: true,       useChunkedEncodingByDefault: true,       sendDate: false,       _removedConnection: false,       _removedContLen: false,       _removedTE: false,       strictContentLength: false,       _contentLength: '66',       _hasBody: true,       _trailer: '',       finished: true,       _headerSent: true,       _closed: true,       socket: [TLSSocket],       _header: 'POST /v1.0/chats/19:4a9bbe73-85df-413a-ae7f-2d60a3841b1f_71fcbd92-3485-4007-a689-95e88b221fea@unq.gbl.spaces/messages HTTP/1.1\r\n' +         'Accept: application/json, text/plain, /\r\n' +         'Content-Type: application/json\r\n' +         'Authorization: Bearer eyJ0eXAiOiJKV1QiLCJub25jZSI6Ii0tRVp1REhiMExKajdDNGNtb24wUkstSzRya28yVmlOVkgyamQ1TUZKUWciLCJhbGciOiJSUzI1NiIsIng1dCI6IkwxS2ZLRklfam5YYndXYzIyeFp4dzFzVUhIMCIsImtpZCI6IkwxS2ZLRklfam5YYndXYzIyeFp4dzFzVUhIMCJ9.eyJhdWQiOiJodHRwczovL2dyYXBoLm1pY3Jvc29mdC5jb20iLCJpc3MiOiJodHRwczovL3N0cy53aW5kb3dzLm5ldC81NjcyZDY0MS04MjMxLTRlNTgtOWQ0NS1jM2Q4NjAzZDhlZDAvIiwiaWF0IjoxNzE3MDc0NDYxLCJuYmYiOjE3MTcwNzQ0NjEsImV4cCI6MTcxNzA3ODM2MSwiYWlvIjoiRTJOZ1lHQ2ZQazBvL2xxeFFzTWttZXJmanZXcEFBPT0iLCJhcHBfZGlzcGxheW5hbWUiOiJyeXpldXAiLCJhcHBpZCI6ImU1YjgzYWQ3LTIwYTgtNGIwNi1iMWMyLTYyMTE2ZjQ3Njk0MiIsImFwcGlkYWNyIjoiMSIsImlkcCI6Imh0dHBzOi8vc3RzLndpbmRvd3MubmV0LzU2NzJkNjQxLTgyMzEtNGU1OC05ZDQ1LWMzZDg2MDNkOGVkMC8iLCJpZHR5cCI6ImFwcCIsIm9pZCI6ImQ3NDkyODFkLTgyYWUtNDU4NS1hMTQzLTJjN2QzNzk1ZTM2MiIsInJoIjoiMC5BVW9BUWRaeVZqR0NXRTZkUmNQWVlEMk8wQU1BQUFBQUFBQUF3QUFBQUFBQUFBQktBQUEuIiwicm9sZXMiOlsiVGVhbU1lbWJlci5SZWFkLkFsbCIsIlVzZXIuUmVhZEJhc2ljLkFsbCIsIkNoYXQuVXBkYXRlUG9saWN5VmlvbGF0aW9uLkFsbCIsIlRlYW13b3JrLk1pZ3JhdGUuQWxsIiwiVXNlci5SZWFkV3JpdGUuQWxsIiwiQ2hhdE1lbWJlci5SZWFkV3JpdGUuQWxsIiwiR3JvdXAuUmVhZC5BbGwiLCJUZWFtLkNyZWF0ZSIsIkdyb3VwLkNyZWF0ZSIsIkdyb3VwLlJlYWRXcml0ZS5BbGwiLCJDaGF0LlJlYWRXcml0ZS5XaGVyZUluc3RhbGxlZCIsIkNoYXRNZXNzYWdlLlJlYWQuQWxsIiwiVXNlci5SZWFkLkFsbCIsIkNoYXQuUmVhZC5XaGVyZUluc3RhbGxlZCIsIkZpbGVzLlJlYWQuQWxsIiwiVGVhbS5SZWFkQmFzaWMuQWxsIiwiQ2hhdC5SZWFkLkFsbCIsIlRlYW1zQXBwSW5zdGFsbGF0aW9uLlJlYWRXcml0ZUZvclRlYW0uQWxsIiwiQ2hhdC5SZWFkQmFzaWMuV2hlcmVJbnN0YWxsZWQiLCJDaGF0LlJlYWRXcml0ZS5BbGwiLCJUZWFtd29yay5SZWFkLkFsbCIsIkNoYXRNZW1iZXIuUmVhZFdyaXRlLldoZXJlSW5zdGFsbGVkIiwiQ2hhdC5SZWFkQmFzaWMuQWxsIiwiQ2hhdE1lbWJlci5SZWFkLkFsbCIsIkNoYXRNZW1iZXIuUmVhZC5XaGVyZUluc3RhbGxlZCIsIkNoYXQuQ3JlYXRlIl0sInN1YiI6ImQ3NDkyODFkLTgyYWUtNDU4NS1hMTQzLTJjN2QzNzk1ZTM2MiIsInRlbmFudF9yZWdpb25fc2NvcGUiOiJBUyIsInRpZCI6IjU2NzJkNjQxLTgyMzEtNGU1OC05ZDQ1LWMzZDg2MDNkOGVkMCIsInV0aSI6ImJFeUtnYU1oQmtpZXVwdENkU0lwQUEiLCJ2ZXIiOiIxLjAiLCJ3aWRzIjpbIjA5OTdhMWQwLTBkMWQtNGFjYi1iNDA4LWQ1Y2E3MzEyMWU5MCJdLCJ4bXNfdGNkdCI6MTU3NTg3MDgwMn0.n_zle3oX92JEbCcrap4-7HCc8jFswzUbxtcbBlEYKLKXwaC6R1BEvnzIPFcbaPWN-Swn0-18W2eHjyiplTLt3b-otiXBP-xfHxiTtNKmPdY-y7xv37D9WQ-UlVSbpVIGmRsEVrC8EcsUysHQ2NKThuetZwQ5yDZAYhnmM9AGQQIfaBUCT1fP5gh-L3ULVt-bkcWcX3QTep2rXrnUrV2O3cTFzVsCEmBR-dAPiZdZzL21RCU4h9tnX43VCxggk6auM1AyUIvIHVsv6NK2OtY2j-jHZHpXG4iq7MZSeAvfTy8UBssBhFB-ncSgB-gWEWtLALtHaVvqiNMQbdLvP0QzbA\r\n' +         'User-Agent: axios/1.7.2\r\n' +         'Content-Length: 66\r\n' +         'Accept-Encoding: gzip, compress, deflate, br\r\n' +         'Host: graph.microsoft.com\r\n' +         'Connection: close\r\n' +         '\r\n',       _keepAliveTimeout: 0,       _onPendingData: [Function: nop],       agent: [Agent],       socketPath: undefined,       method: 'POST',       maxHeaderSize: undefined,       insecureHTTPParser: undefined,       joinDuplicateHeaders: undefined,       path: '/v1.0/chats/19:4a9bbe73-85df-413a-ae7f-2d60a3841b1f_71fcbd92-3485-4007-a689-95e88b221fea@unq.gbl.spaces/messages',       _ended: true,       res: [IncomingMessage],       aborted: false,       timeoutCb: null,       upgradeOrConnect: false,       parser: null,       maxHeadersCount: null,       reusedSocket: false,       host: 'graph.microsoft.com',       protocol: 'https:',       _redirectable: [Writable],       [Symbol(kCapture)]: false,       [Symbol(kBytesWritten)]: 0,       [Symbol(kNeedDrain)]: false,       [Symbol(corked)]: 0,       [Symbol(kOutHeaders)]: [Object: null prototype],       [Symbol(errored)]: null,       [Symbol(kHighWaterMark)]: 16384,       [Symbol(kRejectNonStandardBodyWrites)]: false,       [Symbol(kUniqueHeaders)]: null     },     data: { error: [Object] }   } }

Microsoft Graph
Microsoft Graph
A Microsoft programmability model that exposes REST APIs and client libraries to access data on Microsoft 365 services.
11,205 questions
Microsoft Teams Development
Microsoft Teams Development
Microsoft Teams: A Microsoft customizable chat-based workspace.Development: The process of researching, productizing, and refining new or existing technologies.
2,997 questions
0 comments No comments
{count} votes

3 answers

Sort by: Most helpful
  1. Anushka 320 Reputation points
    2024-05-31T05:47:54.53+00:00

    Hello friend, hope you're having a nice day,

    When encountering a 401 Unauthorized error while trying to send a message to Microsoft Teams using the Graph API, it indicates that there is an issue with the authentication or permissions of the access token. Here are some steps and considerations to troubleshoot and resolve this issue:

    Steps to Resolve the Issue

    1. Verify the Access Token:
      • Ensure that the access token is valid and has not expired. You can use tools like JWT.io to decode the token and check its expiration (exp claim) and scopes (roles claim).
    2. Check Required Permissions:
      • Make sure that the access token has all the necessary permissions. For sending a message to a chat in Microsoft Teams, the following permissions are typically required:
        • Chat.ReadWrite.All
        • Group.ReadWrite.All
        • ChatMessage.Send
      • Double-check that these permissions are granted and that consent has been provided for them.
    3. Token Acquisition:
      • Ensure that the token is acquired correctly and includes the necessary scopes. If using the OAuth 2.0 authorization code flow, make sure the scopes parameter includes all necessary permissions.
    4. Correct Endpoint and Resource:
      • Verify that the URL for the Graph API endpoint is correct. For sending messages to a chat, the URL should be in the format:
    POST https://graph.microsoft.com/v1.0/chats/{chat-id}/messages
    
    
    1. Configuration in Azure Portal:
      • Confirm that the application registration in Azure AD has the correct API permissions set up and that admin consent has been granted if required.
      • Navigate to Azure Portal > Azure Active Directory > App registrations > [Your App] > API permissions and verify the permissions.
    2. Sample Code to Verify:
      • Here’s a sample Node.js code snippet for sending a message to a chat in Microsoft Teams using Axios:
    const axios = require('axios');
         const accessToken = 'YOUR_ACCESS_TOKEN';
         const chatId = 'YOUR_CHAT_ID';
         const message = {
           body: {
             content: "Hello, this is a test message from Node.js!"
           }
         };
         axios.post(`https://graph.microsoft.com/v1.0/chats/${chatId}/messages`, message, {
           headers: {
             'Authorization': `Bearer ${accessToken}`,
             'Content-Type': 'application/json'
           }
         })
         .then(response => {
           console.log('Message sent:', response.data);
         })
         .catch(error => {
           console.error('Error sending message:', error.response ? error.response.data : error.message);
         });
    
    

    Detailed Checklist

    1. Access Token Verification:
      • Decode the access token using JWT.io.
      • Check the exp (expiration time) claim to ensure the token is not expired.
      • Check the roles or scp (scopes) claim to ensure it includes the required permissions.
    2. API Permissions in Azure AD:
      • Ensure that the following API permissions are granted to your application in the Azure portal:
        • Chat.ReadWrite.All
        • Group.ReadWrite.All
        • ChatMessage.Send
      • Grant admin consent for these permissions if required.
    3. Correct Endpoint:
      • Ensure you are using the correct API endpoint URL: https://graph.microsoft.com/v1.0/chats/{chat-id}/messages
    4. HTTP Headers:
      • Ensure the Authorization header is correctly set: Authorization: Bearer YOUR_ACCESS_TOKEN
      • Ensure the Content-Type header is correctly set: Content-Type: application/json
    5. Handling 401 Errors:
      • If you still encounter 401 Unauthorized, log the full error response to inspect any additional details provided by the API.
      • Recheck the permissions granted to the application, and ensure the token is being obtained from the correct Azure AD tenant.

    By following these steps, you should be able to identify and resolve the issue causing the 401 Unauthorized error when attempting to send a message to Microsoft Teams using the Graph API from a Node.js application. I hope your issue gets solved. Have a nice day!


  2. CarlZhao-MSFT 39,256 Reputation points
    2024-05-31T06:05:21.6066667+00:00

    Hi @Satya Krishna Madasu

    As the documentation says, application permissions are only supported for migration. This means that when you use application permissions, you can only import third-party platform messages and cannot send messages.

    To send messages, you should use delegate permissions. Try granting one of the following delegate permissions to the calling app, and then request a token using the delegate flow with user participation.

    User's image

    By the way, the logged in user should be a member of the current chat.


    Hope this helps.

    If the reply is helpful, please click Accept Answer and kindly upvote it. If you have additional questions about this answer, please click Comment.


  3. Rania Asad 0 Reputation points
    2024-05-31T06:35:44.1133333+00:00

    Hello friend, I hope you're having a nice day, How I can follow my friend in my Microsoft learn