Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

MSAL and OAuth 2.0 - Request an authorization code programmatically

Tags:

cypress

msal

e2e

Goal is to get access token from MSAL programmatically for Cypress e2e tests. We use V2.0 API.

According to this I first need to get the authorization code: https://docs.microsoft.com/en-us/azure/active-directory/develop/v2-oauth2-auth-code-flow#request-an-authorization-code

to get the access token https://docs.microsoft.com/en-us/azure/active-directory/develop/v2-oauth2-auth-code-flow#request-an-access-token

So in order to get authorization code I would need to do this request

// GET
// Line breaks for legibility only

https://login.microsoftonline.com/{tenant}/oauth2/v2.0/authorize?
client_id=6731de76-14a6-49ae-97bc-6eba6914391e
&response_type=code
&redirect_uri=http%3A%2F%2Flocalhost%2Fmyapp%2F
&response_mode=query
&scope=openid%20offline_access%20https%3A%2F%2Fgraph.microsoft.com%2Fmail.read
&state=12345
&code_challenge=YTFjNjI1OWYzMzA3MTI4ZDY2Njg5M2RkNmVjNDE5YmEyZGRhOGYyM2IzNjdmZWFhMTQ1ODg3NDcxY2Nl
&code_challenge_method=S256

But this returns text/html so I would need to manually login to get the code.

Is there any way to progammatically to get the authorization code?

like image 833
anmatika Avatar asked Oct 23 '20 08:10

anmatika


People also ask

Is Msal an OAuth?

PKCE is supported by MSAL. The OAuth 2.0 specification requires you use an authorization code to redeem an access token only once. If you attempt to acquire access token multiple times with the same authorization code, an error similar to the following is returned by the Microsoft identity platform.

What is OAuth 2.0 authentication in REST API?

Using OAuth 2.0, it is possible for the application to access the user's data without the disclosure of the user's credentials to the application. The API will grant access only when it receives a valid access token from the application.


1 Answers

This is how I got it solved by creating a login command. The command fetches the token programatically and stores it into localStorage.

import 'cypress-localstorage-commands';

Cypress.Commands.add('login', () => {
  const request = {
    method: 'POST',
    form: true,
    url: `https://login.microsoftonline.com/${Cypress.config('tenantId')}/oauth2/v2.0/token`,
    body: {
      grant_type: 'client_credentials',
      client_id: Cypress.config('clientId'),
      client_secret: Cypress.config('clientSecret'),
      scope: `${Cypress.config('clientId')}/.default`,
    },
  };

  cy.request(request).then(response => cy.setLocalStorage('msal.idtoken', response.body.access_token));
});
like image 65
anmatika Avatar answered Oct 12 '22 21:10

anmatika