In this article, I have explained how to get the current user profile properties in your SPFx webpart using Microsoft Graph API
Create a SPFx project with “Webpart” template & choose the framework “React”
Install the necessary “NPM” packages and am going to use “MSGraphClient” to connect my webpart SPFx with Microsoft Graph API
npm install @microsoft/microsoft-graph-types --save-dev
Microsoft graph types help us to catch the error in your Typescript code faster.
Import the necessary packages in “MyUserInformation.tsx” file under “src\webparts\components”
import * as MicrosoftGraph from '@microsoft/microsoft-graph-types';
Open “IMyUserInformationProps” properties interface import the web part context from sp-webpart-base
import { WebPartContext } from "@microsoft/sp-webpart-base";
Add the “WebPartContext” properties inside the interface the final code look like below
import {WebPartContext } from "@microsoft/sp-webpart-base";
export interface IMyUserInformationProps {
description: string;
context: WebPartContext
}
Open “MyUserInformationWebPart.ts” include the context inside render()
public render(): void {
const element: React.ReactElement<IMyUserInformationProps> = React.createElement(
MyUserInformation,
{
context: this.context,
description: this.properties.description,
}
);
ReactDom.render(element, this.domElement);
}
Create a state interface to hold the data of user profile object
export interface IUserInformationState {
data: {}
}
Initialize the constructor to declare the props and state
export default class MyEvents extends React.Component<IMyEventsProps, IUserInformationState> {
constructor(props: IMyEventsProps) {
super(props);
this.state = {
data: {}
}
}
Create a function named “GetMyProfile()” to fetch the current user information
const GetMyProfile = () => {
this.props.context.msGraphClientFactory.getClient('3').then((client): void => {
client.api('me').get((error, user: MicrosoftGraph.User, rawResponse?: any) => {
this.setState({
data: user
})
}
In “ComponetDidMount()” pass the created function it will retrieve the user information when page renders
componentDidMount(): void {
this.GetMyProfile()
}
Create a child component "UserDetail.tsx" to display user information details. Here I am using parent and child concept in components and send the retrieved data over props
Include the properties interface in your class component look like below
Import the UserDetail.tsx child component in to your parent component “MyUserInformation.tsx”
import UserDetail from './UserDetail';
Inside the render() method pass the component and data over props
public render(): React.ReactElement<IMyUserInformationProps> {
return (
<UserDetail data={this.state.data}></UserDetail>
);
}
Now open the child component “UserDetail.tsx” get the data from the props and render it into your HTML element based on your UI.
Full code
MyUserInformation.tsx
import * as React from 'react';
import styles from './MyUserInformation.module.scss';
import { IMyUserInformationProps } from './IMyUserInformationProps';
import { escape } from '@microsoft/sp-lodash-subset';
import * as MicrosoftGraph from '@microsoft/microsoft-graph-types';
import UserDetail from './UserDetail';
export interface IUserInformationState {
data: {}
}
export default class MyUserInformation extends React.Component<IMyUserInformationProps, IUserInformationState> {
constructor(props: IMyUserInformationProps) {
super(props)
this.state = {
data: {}
}
}
//Connect to Graph API fetch the user information object
GetMyProfile = () => {
this.props.context.msGraphClientFactory.getClient('3').then((client): void => {
client.api('me').get((error, user: MicrosoftGraph.User, rawResponse?: any) => {
console.log(user)
if (user) {
//set the user information object in state property
this.setState({
data: user
})
}
})
})
}
componentDidMount(): void {
this.GetMyProfile()
}
public render(): React.ReactElement<IMyUserInformationProps> {
return (
<UserDetail data={this.state.data}></UserDetail>
);
}
}
UserDetail.tsx
import * as React from 'react';
export interface IUserInformationProps {
data: any
}
class UserDetail extends React.Component <IUserInformationProps> {
constructor(props: IUserInformationProps){
super(props)
}
render() {
return (
<div>
<p style={{fontWeight: "bold"}}>My User Information:</p>
<li>
<i>{this.props.data.mail} </i></li>
<li><i>{this.props.data.displayName} </i></li>
<li><i>{this.props.data.businessPhones} </i></li>
</div>
);
}
}
export default UserDetail;
Before running the webpart include the below permission scopes inside your package-solution.json, You can include multiple permission scopes based on your application requirement
"webApiPermissionRequests": [
{
"resource": "Microsoft Graph",
"scope": "User.Read.All"
}],
After a successful deployment of your webpart, Open SharePoint admin center choose “Advanced -> API Access” from left navigation window.
Approve your permission scope “User.Read.All” is displayed on “Pending requests”
Hit “Gulp Serve” and run the webpart