У меня есть приложение проекта, созданное с использованием 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);
});
});
});
Если кто-то может помочь мне с каким-то образцом реального приложения, видео или что-то, будет очень хорошо. Я теряю рассудок, чтобы понять это.
Спасибо!
Hi Gary! Спасибо за ответ ... Прежде чем увидеть ответ, я получил результаты с использованием adal-узла вместо паспорта с помощью этого метода: 'authenticationContext.acquireTokenWithAuthorizationCode()' Но теперь у меня есть другой WebAPI, настроенный на Azure и у меня все еще есть проблемы с вызовами методов этого API. Я изменил параметр ресурса метода adal-node и получил действительный токен для вызова моего WebAPI, но теперь график не работает с этим токеном. –
Мой вопрос: нужно ли мне использовать 2 разных токена для использования моего WebAPI и API-интерфейса Graph? Является ли это нормально, если я использую «приобретатьTokenWithAuthorizationCode» для проверки подлинности пользователя и вызова Графа и использования «приобретатьTokenWithClientCredentials», чтобы потребовать использовать токен для вызова WebAPI? –
Измените параметр ресурса для разных ресурсов в этом примере https://github.com/AzureAD/azure-activedirectory-library-for-nodejs#authorization-code. НАПРИМЕР. используйте 'resource =" https://graph.windows.net ", чтобы получить токен доступа для ресурса графика Azure AD. –