Я хочу использовать outlook api contact
в React с authentification Azure AD.
Приведенный ниже код работает для нового приложения create-реакции-приложения, но он не работает в моем другом приложении.
"msal": "0.2.3"
"@ microsoft / microsoft-graph-client": "1.3.0"
Когда я использую кнопку с проверкой подлинности, мое приложение перенаправляет на веб-сайт входа в Microsoft, она возвращается на мою текущую страницу, и я не получаю токен. «IsAuthenticated» state not change.
Но я хочу изменить состояние isAuthenticated на true и заполнить пользовательское состояние ответом аутентификации.
С учетом этого кода, вы можете мне помочь?
app.js
import config from './Config';
import { UserAgentApplication } from 'msal';
import { getUserDetails } from './GraphService';
import Calendar from './Calendar';
import './referral.scss';
class DashboardReferral extends LoadingComponent {
constructor(props) {
super(props);
this.userAgentApplication = new UserAgentApplication(config.appId, null, null);
var user = this.userAgentApplication.getUser();
this.state = {
isAuthenticated: (user !== null),
user: {},
error: null
};
if (user) {
// Enhance user object with data from Graph
this.getUserProfile();
}
console.log("erreur de la récup de user")
}
async login() {
try {
console.log("début fonction login")
await this.userAgentApplication.loginRedirect(config.scopes);
await this.getUserProfile();
console.log("ok login")
}
catch (err) {
var errParts = err.split('|');
this.setState({
isAuthenticated: false,
user: {},
error: { message: errParts[1], debug: errParts[0] }
});
console.log("erreur fonction login")
}
}
logout() {
this.userAgentApplication.logout();
}
async getUserProfile() {
try {
// Get the access token silently
// If the cache contains a non-expired token, this function
// will just return the cached token. Otherwise, it will
// make a request to the Azure OAuth endpoint to get a token
var accessToken = await this.userAgentApplication.acquireTokenSilent(config.scopes);
console.log('get user profile', this.userAgentApplication)
console.log(accessToken)
if (accessToken) {
// Get the user's profile from Graph
var user = await getUserDetails(accessToken);
this.setState({
isAuthenticated: true,
user: {
displayName: user.displayName,
email: user.mail || user.userPrincipalName
},
error: null
});
}
}
catch (err) {
var error = {};
console.log(err)
if (typeof (err) === 'string') {
var errParts = err.split('|');
error = errParts.length > 1 ?
{ message: errParts[1], debug: errParts[0] } :
{ message: err };
} else {
error = {
message: err.message,
debug: JSON.stringify(err)
};
}
this.setState({
isAuthenticated: false,
user: {},
error: error
});
}
}
config.js
module.exports = {
appId: '*******************',
scopes: [
"user.read",
"calendars.read",
"contacts.read",
]
};
graphservice.js
var graph = require('@microsoft/microsoft-graph-client');
function getAuthenticatedClient(accessToken) {
// Initialize Graph client
const client = graph.Client.init({
// Use the provided access token to authenticate
// requests
authProvider: (done) => {
done(null, accessToken);
}
});
return client;
}
export async function getUserDetails(accessToken) {
const client = getAuthenticatedClient(accessToken);
const user = await client.api('/me').get();
return user;
}
export async function getEvents(accessToken) {
const client = getAuthenticatedClient(accessToken);
const events = await client
.api('/me/events')
.select('subject,organizer,start,end')
.orderby('createdDateTime DESC')
.get();
return events;
}
export async function getPeople(accessToken) {
const client = getAuthenticatedClient(accessToken);
const people = await client
.api('/me/contacts?$top=2000')
.get();
return people;
}