Advertisement
Guest User

Untitled

a guest
Jul 3rd, 2018
1,282
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. const AUTHORIZATION_URL = `https://login.microsoftonline.com/common/oauth2/v2.0/authorize`;
  2. const TOKEN_URL = `https://login.microsoftonline.com/common/oauth2/v2.0/token`;
  3. const SCOPE = `Mail.Read Mail.Read.Shared User.Read offline_access`;
  4. const CLIENT_ID = ‘XXX’;
  5. const CLIENT_SECRET = ‘XXX;
  6. const REDIRECT_URI = “XXX”;
  7.  
  8. export async function outlookSignIn(fromMain, service, callback) {
  9.   const code = await signInWithPopup(fromMain, service);
  10.   const tokens = await fetchAccessTokens(code);
  11.   return callback(tokens);
  12. }
  13.  
  14. function signInWithPopup(fromMain, service) {
  15.   return new Promise((resolve, reject) => {
  16.     const authWindow = new BrowserWindow({width: 500, height: 600, show: true})
  17.  
  18.     // TODO: Generate and validate PKCE code_challenge value
  19.     const urlParams = {
  20.       response_type: 'code',
  21.       response_mode: 'query',
  22.       state: Math.floor(Math.random() * 1e10) + 1,
  23.       redirect_uri: REDIRECT_URI,
  24.       client_id: CLIENT_ID,
  25.       scope: SCOPE
  26.     }
  27.     const authUrl = `${AUTHORIZATION_URL}?${qs.stringify(urlParams)}`
  28.  
  29.     function handleNavigation(url) {
  30.       const query = parse(url, true).query
  31.       console.log("url",query);
  32.       if (query) {
  33.         if (query.error) {
  34.           reject(new Error(`There was an error: ${query.error}`))
  35.         } else if (query.code) {
  36.           // Login is complete
  37.           authWindow.removeAllListeners('closed')
  38.           setImmediate(() => authWindow.close())
  39.  
  40.           // This is the authorization code we need to request tokens
  41.           resolve(query.code)
  42.         }
  43.       }
  44.     }
  45.  
  46.     authWindow.on('closed', event => {
  47.       fromMain.sender.send('error', service);
  48.     });
  49.  
  50.     authWindow.webContents.on('will-navigate', (event, url) => {
  51.       handleNavigation(url)
  52.     })
  53.  
  54.     authWindow.webContents.on('did-get-redirect-request', (event, oldUrl, newUrl) => {
  55.       handleNavigation(newUrl)
  56.     })
  57.  
  58.     authWindow.loadURL(authUrl)
  59.   }, error => {
  60.     console.log(error);
  61.   })
  62. }
  63.  
  64. async function fetchAccessTokens(code) {
  65.   const response = await axios.post(TOKEN_URL,
  66.     qs.stringify({
  67.       code,
  68.       client_id: CLIENT_ID,
  69.       client_secret: CLIENT_SECRET,
  70.       redirect_uri: REDIRECT_URI,
  71.       grant_type: 'authorization_code',
  72.       scope: SCOPE
  73.     }), {
  74.     headers: {
  75.       'Content-Type': 'application/x-www-form-urlencoded'
  76.     }
  77.   })
  78.   return response.data
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement