2016-11-28 3 views
3

У меня есть приложение проекта, созданное с использованием NodeJS + ReactJS, и все, что я хочу, это использовать Azure AD для аутентификации пользователя и получения его данных, таких как имя, группы, изображение, профессию и т. д., используя Graph API от Azure.Аутентификация пользователей и использование графического API с использованием Azure AD, ReactJS и NodeJS

У меня уже есть Azure AD и приложение правильно настроено на Azure Portal. Включая делегаций разрешений и всех этих сотрудников.

Я пытаюсь понять, как лучший способ сделать это, но безуспешно. Я пытался найти в документах Google, StackOverflow, Microsoft Documentations, даже образцов проектов.

Некоторые образцы работали, но ни один из них я не мог понять и включить в свой проект, чтобы работать как производственное приложение.

Я использовал это для аутентификации пользователя, но возвращаемый маркер доступа не действует для вызова Graph API:

passport.use(new OIDCStrategy({ 
    redirectUrl: config.creds.returnURL, 
    realm: config.creds.realm, 
    clientID: config.creds.clientID, 
    clientSecret: config.creds.clientSecret, 
    oidcIssuer: config.creds.issuer, 
    identityMetadata: config.creds.identityMetadata, 
    skipUserProfile: config.creds.skipUserProfile, 
    responseType: config.creds.responseType, 
    responseMode: config.creds.responseMode, 
    allowHttpForRedirectUrl: config.creds.allowHttpForRedirectUrl 
    }, 
    function(iss, sub, profile, accessToken, refreshToken, done) { 
    console.log(accessToken); 
    profile = profile._json; 
    if (!profile.email) { 
     return done(new Error("No email found"), null); 
    } 
    // asynchronous verification, for effect... 
    process.nextTick(function() { 
     findByEmail(profile.email, function(err, user) { 
     if (err) { 
      return done(err); 
     } 
     if (!user) { 
      // "Auto-registration" 
      users.push(profile); 
      return done(null, profile); 
     } 
     return done(null, user); 
     }); 
    }); 
    } 
)); 

И это одна дает мне право маркер доступа использовать API Graph, но я не могу понять, как использовать его вместо паспорта:

function createAuthorizationUrl(state) { 
    var authorizationUrl = templateAuthzUrl.replace('<client_id>', sampleParameters.clientId); 
    authorizationUrl = authorizationUrl.replace('<redirect_uri>',redirectUri); 
    authorizationUrl = authorizationUrl.replace('<state>', state); 
    authorizationUrl = authorizationUrl.replace('<resource>', resource); 
    return authorizationUrl; 
} 

// Clients get redirected here in order to create an OAuth authorize url and redirect them to AAD. 
// There they will authenticate and give their consent to allow this app access to 
// some resource they own. 
app.get('/auth', function(req, res) { 
    crypto.randomBytes(48, function(ex, buf) { 
    var token = buf.toString('base64').replace(/\//g,'_').replace(/\+/g,'-'); 

    res.cookie('authstate', token); 
    var authorizationUrl = createAuthorizationUrl(token); 

    res.redirect(authorizationUrl); 
    }); 
}); 

// After consent is granted AAD redirects here. The ADAL library is invoked via the 
// AuthenticationContext and retrieves an access token that can be used to access the 
// user owned resource. 
app.get('/getAToken', function(req, res) { 
    if (req.cookies.authstate !== req.query.state) { 
    res.send('error: state does not match'); 
    } 
    var authenticationContext = new AuthenticationContext(authorityUrl); 
    authenticationContext.acquireTokenWithAuthorizationCode(req.query.code, redirectUri, resource, sampleParameters.clientId, sampleParameters.clientSecret, function(err, response) { 
    var message = ''; 
    if (err) { 
     message = 'error: ' + err.message + '\n'; 
    } 
    message += 'response: ' + JSON.stringify(response); 

    if (err) { 
     res.send(message); 
     return; 
    } 

    // Later, if the access token is expired it can be refreshed. 
    authenticationContext.acquireTokenWithRefreshToken(response.refreshToken, sampleParameters.clientId, sampleParameters.clientSecret, resource, function(refreshErr, refreshResponse) { 
     if (refreshErr) { 
     message += 'refreshError: ' + refreshErr.message + '\n'; 
     } 
     message += 'refreshResponse: ' + JSON.stringify(refreshResponse); 

     res.send(message); 
    }); 
    }); 
}); 

Если кто-то может помочь мне с каким-то образцом реального приложения, видео или что-то, будет очень хорошо. Я теряю рассудок, чтобы понять это.

Спасибо!

ответ

2

Паспорт OIDCStrategy следует за Authorize access to web applications using OpenID Connect and Azure Active Directory для аутентификации & авторизованных пользователей. И если вам нужен доступ к ресурсам, вам все равно нужно выполнить шаг Use the authorization code to request an access token.

добавить некоторые фрагменты кода на основе openid connection sample:

Возвращение функция маршрут получит Используйте code приобрести маркер доступа и сохранения в объект пользователя seesion.

app.post('/auth/openid/return', 
    passport.authenticate('azuread-openidconnect', { failureRedirect: '/login' }), 
    function (req, res) { 
    let option = { 
     method:'POST', 
     uri:'https://login.microsoftonline.com/<tenant_id>/oauth2/token', 
     headers:{ 
     'Content-Type':'application/x-www-form-urlencoded' 
     }, 
     form:{ 
     grant_type:'authorization_code', 
     client_id:'<client_id>', 
     resource:'https://graph.windows.net', 
     client_secret:'<secret_key>', 
     code:req.body.code, 
     redirect_uri:'http://localhost:3000/auth/openid/return' 
     } 
    } 
    console.log(option); 
    request(option,function(err,res,body){ 
     req.user.access_token = JSON.parse(body).access_token; 
    }) 

    // log.info('We received a return from AzureAD.'); 
    res.redirect('/'); 
    }); 

Маршрут '/ me' предназначен для использования, чтобы использовать токен доступа, чтобы потребовать повторного использования.

app.get('/me',ensureAuthenticated ,function(req,response){ 
    request.get("https://graph.windows.net/<tenant_id>/me?api-version=1.5", { 
    'headers': { 
     'Authorization': "Bearer " + req.user.access_token, 
     'Content-Type': 'application/json' 
    } 
    }, function(err, res, body){ 
    if(err){ 
     console.log("err: " + err); 
    } 
    else{ 
     console.log("res: " + res); 
     response.send(res); 
    } 
    }); 
}); 

Любые дальнейшие заботы, пожалуйста, не стесняйтесь, дайте мне знать.

+0

Hi Gary! Спасибо за ответ ... Прежде чем увидеть ответ, я получил результаты с использованием adal-узла вместо паспорта с помощью этого метода: 'authenticationContext.acquireTokenWithAuthorizationCode()' Но теперь у меня есть другой WebAPI, настроенный на Azure и у меня все еще есть проблемы с вызовами методов этого API. Я изменил параметр ресурса метода adal-node и получил действительный токен для вызова моего WebAPI, но теперь график не работает с этим токеном. –

+0

Мой вопрос: нужно ли мне использовать 2 разных токена для использования моего WebAPI и API-интерфейса Graph? Является ли это нормально, если я использую «приобретатьTokenWithAuthorizationCode» для проверки подлинности пользователя и вызова Графа и использования «приобретатьTokenWithClientCredentials», чтобы потребовать использовать токен для вызова WebAPI? –

+0

Измените параметр ресурса для разных ресурсов в этом примере https://github.com/AzureAD/azure-activedirectory-library-for-nodejs#authorization-code. НАПРИМЕР. используйте 'resource =" https://graph.windows.net ", чтобы получить токен доступа для ресурса графика Azure AD. –

Смежные вопросы