SlideShare una empresa de Scribd logo
1 de 41
Elio Struyf | Trainer @ U2U – MVP | June 24th, 2017
Getting notified by SharePoint with the webHook
functionality
Thanks to the Sponsors!
#SPSLondon - @eliostruyf
What are WebHooks?
#SPSLondon - @eliostruyf
What are WebHooks?
• Event driven notifications AKA callbacks from the web
• Universal model used by many services: GitHub, Slack, MailChimp, …
• Pushing mechanism  asynchronous!
• Implemented in various Office 365 Services
• Microsoft Graph
• Connectors
• SharePoint
#SPSLondon - @eliostruyf
WebHooks in SPO went GA
in January 2017
#SPSLondon - @eliostruyf
Where can you use them?
• SharePoint
• List
• Libraries
• Microsoft Graph
• Messages, events, contacts, conversations in groups, OneDrive root items
#SPSLondon - @eliostruyf
The good and the bad
• WebHooks are asynchronous mechanism
• Retry mechanism
• 5 times with a delay of 5 minutes
• More secure, no event information is passed
• No support for event-ing events  only RER can be used
• Add-ing, update-ing, delete-ing
• Requires some setup, but once done, it is easy to maintain
#SPSLondon - @eliostruyf
Remote event receivers vs WebHooks
Remote event receivers
• Synchronous (-ing) and/or async (-ed)
• One request
• One change = one request
• Changes are inside the request body
• 2 minutes to respond
• Indefinitely
• One try
WebHooks
• Async only
• Retry logic: 5 times
• Batched requests
• Only notification  more secure
• 5 seconds to respond
• Needs subscription renewal
• When it fails, you can try again later
Both use the same base principle: call an external URI when something happens
#SPSLondon - @eliostruyf
How to start using
WebHooks?
#SPSLondon - @eliostruyf
By subscribing to a WebHook!
Notification service
1. Create a subscription
4. SharePoint responds with subscription info
#SPSLondon - @eliostruyf
Important things about subscribing
Subscribing: POST - /_api/web/lists/getbytitle('Title')/subscriptions
{
"resource": "https://tenant.sharepoint.com/sites/site/_api/web/lists/getbytitle('Title')",
"notificationUrl": "Your notification service URL – HTTPS is required",
"expirationDateTime": "Date value - maximum 6 months",
"clientState": "String value for validation (optional)"
}
#SPSLondon - @eliostruyf
Important things about subscribing
SharePoint calls your notification service:
POST - https://notification-service?validationToken={random-guid}
Respond with:
Important: notification service needs to respond in < 5 seconds
Status: 200
Body: validationtoken
#SPSLondon - @eliostruyf
Important things about subscribing
When validation is done, SharePoint returns the subscription
information
#SPSLondon - @eliostruyf
Local development and testing:
ngrok - Secure tunnels to localhost
https://ngrok.com/
#SPSLondon - @eliostruyf
Demo
Subscribing to a WebHook
#SPSLondon - @eliostruyf
More about the notification
service
#SPSLondon - @eliostruyf
Notification service details
• You choose the technology: Web API, Node.js, …
• Respond in < 5 seconds and with status: 200-299 range
• Retry mechanism  5 times (5 minute in between)
• Not for the validation process
• Receives minimal information, just a message “something” happened
• Service has to gather the changes from SharePoint
#SPSLondon - @eliostruyf
Minimal notification information?
#SPSLondon - @eliostruyf
This is what you will receive
{
"value": [
{
"subscriptionId":"2e7f9cd7-5cdb-4d57-b4d5-edc083202378",
"clientState":null,
"expirationDateTime":"2017-08-16T10:38:54.3440000Z",
"resource":"465b36fc-e778-4047-8425-3f906497dfc3",
"tenantId":"9fee8694-d491-4e3e-b10b-a81ee76dfad9",
"siteUrl":"/sites/Webhooks",
"webId":"e363e4e9-0161-495f-a652-15c618e2e963“
}]
}
#SPSLondon - @eliostruyf
How do I know what happened?
• SPList.GetChanges method
• POST - `/_api/web/lists(guid'${resource}')/getchanges`
• Specify a change query + change token
{
"Item": true,
"Add": true,
"Update": true,
"DeleteObject": true,
"Restore": true,
"ChangeTokenStart": {
"StringValue": "1;3;465b36fc-e778-4047-8425-3f906497dfc3;636307008298500000;60877869"
}
}
ChangeQuery properties: http://elst.es/2rib2q7
#SPSLondon - @eliostruyf
Anatomy of the change token
1;3;465b36fc-e778-4047-8425-3f906497dfc3;636307008298500000;60877869
Version information (currently always 1)
Scope of the change. 3 = List & library changes.
Resource ID, can be retrieved from the subscription notification
Timestamp in ticks
Change number
in the event
cache table. You
can start with -1.
#SPSLondon - @eliostruyf
Using the change token
• Using GetChanges without ChangeToken would return everything
• By specifying a change token, you control what you need
#SPSLondon - @eliostruyf
Things to know about the change token
• First time, create it yourself (ex.: get all changes of the last hour)
• Per GetChanges request, you get the latest change token
• Store the latest change token, use it for the next call
{
"ChangeToken": {
"StringValue":"1;3;465b36fc-e778-4047-8425-3f906497dfc3;636307074435230000;60879219"
},
"ChangeType": 2,
"SiteId": "1432d309-9f6a-4dae-8d35-532dec332b86",
"ItemId": 3,
…
}
#SPSLondon - @eliostruyf
GetChanges response value
• Notice the ChangeType, it is an enumeration
• 1 = added, 2 = updated, 3 = deleted
{
"ChangeToken": {
"StringValue":"1;3;465b36fc-e778-4047-8425-3f906497dfc3;636307074435230000;60879219"
},
"ChangeType": 2,
"SiteId": "1432d309-9f6a-4dae-8d35-532dec332b86",
"ItemId": 3,
"ServerRelativeUrl":"",
…
"WebId":"e363e4e9-0161-495f-a652-15c618e2e963"
}
More information about the ChangeTypes - http://elst.es/2ruAfKn
#SPSLondon - @eliostruyf
Supported event types
• Added
• Updated
• Deleted
• CheckedOut
• CheckedIn
• UncheckedOut
• AttachmentAdded
• AttachmentDeleted
• FileMoved
• VersionDeleted
• FileConverted
#SPSLondon - @eliostruyf
Creating your notification
service
#SPSLondon - @eliostruyf
Tokens, all about the OAuth tokens
• Azure AD app registration
• Generate a certificate
• SharePoint requires access tokens with appidacr property set to 2
• Application Authentication Context Class Reference
• 0 = Public client
• 1 = Identified by a client id and secret
• 2 = Identified by a certificate
Azure AD application manifest
Store this in a separate file (privatekey.pem)
Fingerprint is also require to get the access token
#SPSLondon - @eliostruyf
public getAppOnlyAccessToken(config: IConfig): Promise<any> {
return new Promise((resolve, reject) => {
const certificate = fs.readFileSync(path.join(__dirname, 'privatekey.pem'), { encoding : 'utf8'});
const authContext = new adal.AuthenticationContext(config.adalConfig.authority);
authContext.acquireTokenWithClientCertificate(config.adalConfig.resource, config.adalConfig.clientID, certificate,
config.adalConfig.fingerPrint, (err, tokenRes) => {
if (err) {
reject(err);
}
const accesstoken = tokenRes.accessToken;
resolve(accesstoken);
});
});
}
Get an access token via a certificate and
private key with ADAL for JS
#SPSLondon - @eliostruyf
Important APIs
• Retrieve all list / library subscriptions
GET - /_api/web/lists/getbytitle('ListTitle')/subscriptions
• Update a subscription
PATCH - /_api/web/lists/getbytitle('ListTitle')/subscriptions('${subId}')
Body: { "expirationDateTime": "New expiration date" }
• Delete a subscription
DELETE - /_api/web/lists/getbytitle('ListTitle')/subscriptions('${subId}')
#SPSLondon - @eliostruyf
Demo
Sample application
#SPSLondon - @eliostruyf
A real life setup and configuration
SPO config page
HTTP Triggered function
Queue triggered function
1. Subscribe 2. Validate
3. Trigger change
4. Notify service
5. Put notification message on a queue6. Respond with 200
Use the page to:
- Check subscriptions
- Update subscriptions
- Delete subscriptions
7. Trigger another Azure function that will do change handling
8. Retrieve latest change token10. Store latest change token
#SPSLondon - @eliostruyf
Demo
SPFx + Azure Functions
#SPSLondon - @eliostruyf
Recap
• Notification service has to respond in < 5 seconds
• Retry mechanism  5 times (5 minute delay)
• Not for the validation process
• Subscription expiration date: 6 months
• Create a check or renewal process in your subscription processor
• You need to ask for the changes that happened  minimal
information is send
• Get the changes only what you are interested in
• No synchronous events for SPO  event-ing events
Questions?
Office Servers & Services MVP
Azure / Office 365 / SharePoint
@eliostruyf
www.eliostruyf.com
info@estruyf.be
Elio Struyf
Lead trainer and architect
#SPSLondon - @eliostruyf
Resources
Certificate creation process with makecert - http://elst.es/2rhveZc
Keycred GitHub - http://elst.es/2pW77vm
All about the Change token - http://elst.es/2runG1M
ChangeType enumeration - http://elst.es/2ruAfKn
ChangeQuery properties - http://elst.es/2rib2q7
C# Sample application - http://elst.es/2qUYg0M
Node.js / TypeScript sample application - http://elst.es/2qVpTqT or http://elst.es/2cycM82
SharePoint List WebHooks docs - http://elst.es/2qwl1as - http://elst.es/2quVjD0

Más contenido relacionado

La actualidad más candente

Intro to Front-End Web Devlopment
Intro to Front-End Web DevlopmentIntro to Front-End Web Devlopment
Intro to Front-End Web Devlopment
damonras
 

La actualidad más candente (20)

CoC23_ Looking at the New Features of Apache NiFi
CoC23_ Looking at the New Features of Apache NiFiCoC23_ Looking at the New Features of Apache NiFi
CoC23_ Looking at the New Features of Apache NiFi
 
Microservices with Minimal APi and .NET 6
Microservices with Minimal APi and .NET 6Microservices with Minimal APi and .NET 6
Microservices with Minimal APi and .NET 6
 
Ksh portfolio
Ksh portfolioKsh portfolio
Ksh portfolio
 
An Introduction to Vuejs
An Introduction to VuejsAn Introduction to Vuejs
An Introduction to Vuejs
 
C# ASP.NET WEB API APPLICATION DEVELOPMENT
C# ASP.NET WEB API APPLICATION DEVELOPMENTC# ASP.NET WEB API APPLICATION DEVELOPMENT
C# ASP.NET WEB API APPLICATION DEVELOPMENT
 
Introduction to red hat agile integration (Red Hat Workshop)
Introduction to red hat agile integration (Red Hat Workshop)Introduction to red hat agile integration (Red Hat Workshop)
Introduction to red hat agile integration (Red Hat Workshop)
 
Introducing Swagger
Introducing SwaggerIntroducing Swagger
Introducing Swagger
 
Get Started with ReactJS 18 Development Services_ New Features and Updates.pptx
Get Started with ReactJS 18 Development Services_ New Features and Updates.pptxGet Started with ReactJS 18 Development Services_ New Features and Updates.pptx
Get Started with ReactJS 18 Development Services_ New Features and Updates.pptx
 
The automation challenge: Kubernetes Operators vs Helm Charts
The automation challenge: Kubernetes Operators vs Helm ChartsThe automation challenge: Kubernetes Operators vs Helm Charts
The automation challenge: Kubernetes Operators vs Helm Charts
 
Web API or WCF - An Architectural Comparison
Web API or WCF - An Architectural ComparisonWeb API or WCF - An Architectural Comparison
Web API or WCF - An Architectural Comparison
 
Microservices - BFF architecture and implementation
Microservices - BFF architecture and implementationMicroservices - BFF architecture and implementation
Microservices - BFF architecture and implementation
 
Stateless Auth using OAuth2 & JWT
Stateless Auth using OAuth2 & JWTStateless Auth using OAuth2 & JWT
Stateless Auth using OAuth2 & JWT
 
Intro to Front-End Web Devlopment
Intro to Front-End Web DevlopmentIntro to Front-End Web Devlopment
Intro to Front-End Web Devlopment
 
Vue.js
Vue.jsVue.js
Vue.js
 
Introduction to REST - API
Introduction to REST - APIIntroduction to REST - API
Introduction to REST - API
 
Api design best practice
Api design best practiceApi design best practice
Api design best practice
 
Vue.js Getting Started
Vue.js Getting StartedVue.js Getting Started
Vue.js Getting Started
 
Opentelemetry - From frontend to backend
Opentelemetry - From frontend to backendOpentelemetry - From frontend to backend
Opentelemetry - From frontend to backend
 
Jitney, Kafka at Airbnb
Jitney, Kafka at AirbnbJitney, Kafka at Airbnb
Jitney, Kafka at Airbnb
 
Clean architecture - PHP
Clean architecture - PHPClean architecture - PHP
Clean architecture - PHP
 

Similar a Getting notified by SharePoint with the webhook functionality

Entwickler camp2012 how to connect your app to the activity stream with x_pages
Entwickler camp2012 how to connect your app to the activity stream with x_pagesEntwickler camp2012 how to connect your app to the activity stream with x_pages
Entwickler camp2012 how to connect your app to the activity stream with x_pages
Frank van der Linden
 
SPSRED - BCS, REST ans Subscriptions
SPSRED - BCS, REST ans SubscriptionsSPSRED - BCS, REST ans Subscriptions
SPSRED - BCS, REST ans Subscriptions
Chris Givens
 
jsSaturday - PhoneGap and jQuery Mobile for SharePoint 2013
jsSaturday - PhoneGap and jQuery Mobile for SharePoint 2013jsSaturday - PhoneGap and jQuery Mobile for SharePoint 2013
jsSaturday - PhoneGap and jQuery Mobile for SharePoint 2013
Kiril Iliev
 

Similar a Getting notified by SharePoint with the webhook functionality (20)

SPSNL17 - Getting notified by SharePoint with the webhook functionality - Eli...
SPSNL17 - Getting notified by SharePoint with the webhook functionality - Eli...SPSNL17 - Getting notified by SharePoint with the webhook functionality - Eli...
SPSNL17 - Getting notified by SharePoint with the webhook functionality - Eli...
 
SharePoint 2013 REST APIs
SharePoint 2013 REST APIsSharePoint 2013 REST APIs
SharePoint 2013 REST APIs
 
PnP Monthly Community Call - April 2018
PnP Monthly Community Call - April 2018PnP Monthly Community Call - April 2018
PnP Monthly Community Call - April 2018
 
Microservices and the Art of Taming the Dependency Hell Monster
Microservices and the Art of Taming the Dependency Hell MonsterMicroservices and the Art of Taming the Dependency Hell Monster
Microservices and the Art of Taming the Dependency Hell Monster
 
Evolution of the REST API
Evolution of the REST APIEvolution of the REST API
Evolution of the REST API
 
10 points to make a rogue SharePoint environment really, really secure..
10 points to make a rogue SharePoint environment really, really secure..10 points to make a rogue SharePoint environment really, really secure..
10 points to make a rogue SharePoint environment really, really secure..
 
Entwickler camp2012 how to connect your app to the activity stream with x_pages
Entwickler camp2012 how to connect your app to the activity stream with x_pagesEntwickler camp2012 how to connect your app to the activity stream with x_pages
Entwickler camp2012 how to connect your app to the activity stream with x_pages
 
Foxtrot: Real time analytics
Foxtrot: Real time analyticsFoxtrot: Real time analytics
Foxtrot: Real time analytics
 
Spring MVC to iOS and the REST
Spring MVC to iOS and the RESTSpring MVC to iOS and the REST
Spring MVC to iOS and the REST
 
Develop IoT project with AirVantage M2M Cloud
Develop IoT project with AirVantage M2M CloudDevelop IoT project with AirVantage M2M Cloud
Develop IoT project with AirVantage M2M Cloud
 
Blockchain in the Food Supply Chain
Blockchain in the Food Supply ChainBlockchain in the Food Supply Chain
Blockchain in the Food Supply Chain
 
The Spring Update
The Spring UpdateThe Spring Update
The Spring Update
 
Ajug - The Spring Update
Ajug - The Spring UpdateAjug - The Spring Update
Ajug - The Spring Update
 
SPS Oslo 2018 - Office 365 User Onboarding
SPS Oslo 2018 - Office 365 User OnboardingSPS Oslo 2018 - Office 365 User Onboarding
SPS Oslo 2018 - Office 365 User Onboarding
 
Externalizing Authorization in Micro Services world
Externalizing Authorization in Micro Services worldExternalizing Authorization in Micro Services world
Externalizing Authorization in Micro Services world
 
SPSRED - BCS, REST ans Subscriptions
SPSRED - BCS, REST ans SubscriptionsSPSRED - BCS, REST ans Subscriptions
SPSRED - BCS, REST ans Subscriptions
 
OpenSocial and Mixi platform
OpenSocial and Mixi platformOpenSocial and Mixi platform
OpenSocial and Mixi platform
 
jsSaturday - PhoneGap and jQuery Mobile for SharePoint 2013
jsSaturday - PhoneGap and jQuery Mobile for SharePoint 2013jsSaturday - PhoneGap and jQuery Mobile for SharePoint 2013
jsSaturday - PhoneGap and jQuery Mobile for SharePoint 2013
 
Introduction to PowerShell for SharePoint Admins and Developers
Introduction to PowerShell for SharePoint Admins and DevelopersIntroduction to PowerShell for SharePoint Admins and Developers
Introduction to PowerShell for SharePoint Admins and Developers
 
How bol.com makes sense of its logs, using the Elastic technology stack.
How bol.com makes sense of its logs, using the Elastic technology stack.How bol.com makes sense of its logs, using the Elastic technology stack.
How bol.com makes sense of its logs, using the Elastic technology stack.
 

Más de Elio Struyf

Farewell XSL, Welcome Display Templates SPSNL
Farewell XSL, Welcome Display Templates SPSNLFarewell XSL, Welcome Display Templates SPSNL
Farewell XSL, Welcome Display Templates SPSNL
Elio Struyf
 
Biwug presenation-spsbe33
Biwug presenation-spsbe33Biwug presenation-spsbe33
Biwug presenation-spsbe33
Elio Struyf
 

Más de Elio Struyf (6)

SPSBE - Improving your SharePoint search experience
SPSBE - Improving your SharePoint search experienceSPSBE - Improving your SharePoint search experience
SPSBE - Improving your SharePoint search experience
 
Take your display template skills to the next level
Take your display template skills to the next levelTake your display template skills to the next level
Take your display template skills to the next level
 
Farewell XSL, Welcome Display Templates SPSNL
Farewell XSL, Welcome Display Templates SPSNLFarewell XSL, Welcome Display Templates SPSNL
Farewell XSL, Welcome Display Templates SPSNL
 
Farewell XSL, Welcome Display Templates
Farewell XSL, Welcome Display TemplatesFarewell XSL, Welcome Display Templates
Farewell XSL, Welcome Display Templates
 
Biwug presenation-spsbe33
Biwug presenation-spsbe33Biwug presenation-spsbe33
Biwug presenation-spsbe33
 
Introduction to XSLT SPSBE07
Introduction to XSLT SPSBE07Introduction to XSLT SPSBE07
Introduction to XSLT SPSBE07
 

Último

Cloud Frontiers: A Deep Dive into Serverless Spatial Data and FME
Cloud Frontiers:  A Deep Dive into Serverless Spatial Data and FMECloud Frontiers:  A Deep Dive into Serverless Spatial Data and FME
Cloud Frontiers: A Deep Dive into Serverless Spatial Data and FME
Safe Software
 
+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...
+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...
+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...
?#DUbAI#??##{{(☎️+971_581248768%)**%*]'#abortion pills for sale in dubai@
 
Cloud Frontiers: A Deep Dive into Serverless Spatial Data and FME
Cloud Frontiers:  A Deep Dive into Serverless Spatial Data and FMECloud Frontiers:  A Deep Dive into Serverless Spatial Data and FME
Cloud Frontiers: A Deep Dive into Serverless Spatial Data and FME
Safe Software
 
Modular Monolith - a Practical Alternative to Microservices @ Devoxx UK 2024
Modular Monolith - a Practical Alternative to Microservices @ Devoxx UK 2024Modular Monolith - a Practical Alternative to Microservices @ Devoxx UK 2024
Modular Monolith - a Practical Alternative to Microservices @ Devoxx UK 2024
Victor Rentea
 
Finding Java's Hidden Performance Traps @ DevoxxUK 2024
Finding Java's Hidden Performance Traps @ DevoxxUK 2024Finding Java's Hidden Performance Traps @ DevoxxUK 2024
Finding Java's Hidden Performance Traps @ DevoxxUK 2024
Victor Rentea
 

Último (20)

Strategies for Landing an Oracle DBA Job as a Fresher
Strategies for Landing an Oracle DBA Job as a FresherStrategies for Landing an Oracle DBA Job as a Fresher
Strategies for Landing an Oracle DBA Job as a Fresher
 
Exploring Multimodal Embeddings with Milvus
Exploring Multimodal Embeddings with MilvusExploring Multimodal Embeddings with Milvus
Exploring Multimodal Embeddings with Milvus
 
Polkadot JAM Slides - Token2049 - By Dr. Gavin Wood
Polkadot JAM Slides - Token2049 - By Dr. Gavin WoodPolkadot JAM Slides - Token2049 - By Dr. Gavin Wood
Polkadot JAM Slides - Token2049 - By Dr. Gavin Wood
 
Cloud Frontiers: A Deep Dive into Serverless Spatial Data and FME
Cloud Frontiers:  A Deep Dive into Serverless Spatial Data and FMECloud Frontiers:  A Deep Dive into Serverless Spatial Data and FME
Cloud Frontiers: A Deep Dive into Serverless Spatial Data and FME
 
AWS Community Day CPH - Three problems of Terraform
AWS Community Day CPH - Three problems of TerraformAWS Community Day CPH - Three problems of Terraform
AWS Community Day CPH - Three problems of Terraform
 
[BuildWithAI] Introduction to Gemini.pdf
[BuildWithAI] Introduction to Gemini.pdf[BuildWithAI] Introduction to Gemini.pdf
[BuildWithAI] Introduction to Gemini.pdf
 
Apidays New York 2024 - Accelerating FinTech Innovation by Vasa Krishnan, Fin...
Apidays New York 2024 - Accelerating FinTech Innovation by Vasa Krishnan, Fin...Apidays New York 2024 - Accelerating FinTech Innovation by Vasa Krishnan, Fin...
Apidays New York 2024 - Accelerating FinTech Innovation by Vasa Krishnan, Fin...
 
Biography Of Angeliki Cooney | Senior Vice President Life Sciences | Albany, ...
Biography Of Angeliki Cooney | Senior Vice President Life Sciences | Albany, ...Biography Of Angeliki Cooney | Senior Vice President Life Sciences | Albany, ...
Biography Of Angeliki Cooney | Senior Vice President Life Sciences | Albany, ...
 
DBX First Quarter 2024 Investor Presentation
DBX First Quarter 2024 Investor PresentationDBX First Quarter 2024 Investor Presentation
DBX First Quarter 2024 Investor Presentation
 
EMPOWERMENT TECHNOLOGY GRADE 11 QUARTER 2 REVIEWER
EMPOWERMENT TECHNOLOGY GRADE 11 QUARTER 2 REVIEWEREMPOWERMENT TECHNOLOGY GRADE 11 QUARTER 2 REVIEWER
EMPOWERMENT TECHNOLOGY GRADE 11 QUARTER 2 REVIEWER
 
+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...
+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...
+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...
 
Cloud Frontiers: A Deep Dive into Serverless Spatial Data and FME
Cloud Frontiers:  A Deep Dive into Serverless Spatial Data and FMECloud Frontiers:  A Deep Dive into Serverless Spatial Data and FME
Cloud Frontiers: A Deep Dive into Serverless Spatial Data and FME
 
ProductAnonymous-April2024-WinProductDiscovery-MelissaKlemke
ProductAnonymous-April2024-WinProductDiscovery-MelissaKlemkeProductAnonymous-April2024-WinProductDiscovery-MelissaKlemke
ProductAnonymous-April2024-WinProductDiscovery-MelissaKlemke
 
Strategize a Smooth Tenant-to-tenant Migration and Copilot Takeoff
Strategize a Smooth Tenant-to-tenant Migration and Copilot TakeoffStrategize a Smooth Tenant-to-tenant Migration and Copilot Takeoff
Strategize a Smooth Tenant-to-tenant Migration and Copilot Takeoff
 
Six Myths about Ontologies: The Basics of Formal Ontology
Six Myths about Ontologies: The Basics of Formal OntologySix Myths about Ontologies: The Basics of Formal Ontology
Six Myths about Ontologies: The Basics of Formal Ontology
 
Connector Corner: Accelerate revenue generation using UiPath API-centric busi...
Connector Corner: Accelerate revenue generation using UiPath API-centric busi...Connector Corner: Accelerate revenue generation using UiPath API-centric busi...
Connector Corner: Accelerate revenue generation using UiPath API-centric busi...
 
WSO2's API Vision: Unifying Control, Empowering Developers
WSO2's API Vision: Unifying Control, Empowering DevelopersWSO2's API Vision: Unifying Control, Empowering Developers
WSO2's API Vision: Unifying Control, Empowering Developers
 
Modular Monolith - a Practical Alternative to Microservices @ Devoxx UK 2024
Modular Monolith - a Practical Alternative to Microservices @ Devoxx UK 2024Modular Monolith - a Practical Alternative to Microservices @ Devoxx UK 2024
Modular Monolith - a Practical Alternative to Microservices @ Devoxx UK 2024
 
Finding Java's Hidden Performance Traps @ DevoxxUK 2024
Finding Java's Hidden Performance Traps @ DevoxxUK 2024Finding Java's Hidden Performance Traps @ DevoxxUK 2024
Finding Java's Hidden Performance Traps @ DevoxxUK 2024
 
ICT role in 21st century education and its challenges
ICT role in 21st century education and its challengesICT role in 21st century education and its challenges
ICT role in 21st century education and its challenges
 

Getting notified by SharePoint with the webhook functionality

  • 1. Elio Struyf | Trainer @ U2U – MVP | June 24th, 2017 Getting notified by SharePoint with the webHook functionality
  • 2. Thanks to the Sponsors!
  • 4. #SPSLondon - @eliostruyf What are WebHooks? • Event driven notifications AKA callbacks from the web • Universal model used by many services: GitHub, Slack, MailChimp, … • Pushing mechanism  asynchronous! • Implemented in various Office 365 Services • Microsoft Graph • Connectors • SharePoint
  • 5. #SPSLondon - @eliostruyf WebHooks in SPO went GA in January 2017
  • 6. #SPSLondon - @eliostruyf Where can you use them? • SharePoint • List • Libraries • Microsoft Graph • Messages, events, contacts, conversations in groups, OneDrive root items
  • 7. #SPSLondon - @eliostruyf The good and the bad • WebHooks are asynchronous mechanism • Retry mechanism • 5 times with a delay of 5 minutes • More secure, no event information is passed • No support for event-ing events  only RER can be used • Add-ing, update-ing, delete-ing • Requires some setup, but once done, it is easy to maintain
  • 8. #SPSLondon - @eliostruyf Remote event receivers vs WebHooks Remote event receivers • Synchronous (-ing) and/or async (-ed) • One request • One change = one request • Changes are inside the request body • 2 minutes to respond • Indefinitely • One try WebHooks • Async only • Retry logic: 5 times • Batched requests • Only notification  more secure • 5 seconds to respond • Needs subscription renewal • When it fails, you can try again later Both use the same base principle: call an external URI when something happens
  • 9. #SPSLondon - @eliostruyf How to start using WebHooks?
  • 10. #SPSLondon - @eliostruyf By subscribing to a WebHook! Notification service 1. Create a subscription 4. SharePoint responds with subscription info
  • 11. #SPSLondon - @eliostruyf Important things about subscribing Subscribing: POST - /_api/web/lists/getbytitle('Title')/subscriptions { "resource": "https://tenant.sharepoint.com/sites/site/_api/web/lists/getbytitle('Title')", "notificationUrl": "Your notification service URL – HTTPS is required", "expirationDateTime": "Date value - maximum 6 months", "clientState": "String value for validation (optional)" }
  • 12. #SPSLondon - @eliostruyf Important things about subscribing SharePoint calls your notification service: POST - https://notification-service?validationToken={random-guid} Respond with: Important: notification service needs to respond in < 5 seconds Status: 200 Body: validationtoken
  • 13. #SPSLondon - @eliostruyf Important things about subscribing When validation is done, SharePoint returns the subscription information
  • 14. #SPSLondon - @eliostruyf Local development and testing: ngrok - Secure tunnels to localhost https://ngrok.com/
  • 15.
  • 17. #SPSLondon - @eliostruyf More about the notification service
  • 18. #SPSLondon - @eliostruyf Notification service details • You choose the technology: Web API, Node.js, … • Respond in < 5 seconds and with status: 200-299 range • Retry mechanism  5 times (5 minute in between) • Not for the validation process • Receives minimal information, just a message “something” happened • Service has to gather the changes from SharePoint
  • 19. #SPSLondon - @eliostruyf Minimal notification information?
  • 20. #SPSLondon - @eliostruyf This is what you will receive { "value": [ { "subscriptionId":"2e7f9cd7-5cdb-4d57-b4d5-edc083202378", "clientState":null, "expirationDateTime":"2017-08-16T10:38:54.3440000Z", "resource":"465b36fc-e778-4047-8425-3f906497dfc3", "tenantId":"9fee8694-d491-4e3e-b10b-a81ee76dfad9", "siteUrl":"/sites/Webhooks", "webId":"e363e4e9-0161-495f-a652-15c618e2e963“ }] }
  • 21. #SPSLondon - @eliostruyf How do I know what happened? • SPList.GetChanges method • POST - `/_api/web/lists(guid'${resource}')/getchanges` • Specify a change query + change token { "Item": true, "Add": true, "Update": true, "DeleteObject": true, "Restore": true, "ChangeTokenStart": { "StringValue": "1;3;465b36fc-e778-4047-8425-3f906497dfc3;636307008298500000;60877869" } } ChangeQuery properties: http://elst.es/2rib2q7
  • 22. #SPSLondon - @eliostruyf Anatomy of the change token 1;3;465b36fc-e778-4047-8425-3f906497dfc3;636307008298500000;60877869 Version information (currently always 1) Scope of the change. 3 = List & library changes. Resource ID, can be retrieved from the subscription notification Timestamp in ticks Change number in the event cache table. You can start with -1.
  • 23. #SPSLondon - @eliostruyf Using the change token • Using GetChanges without ChangeToken would return everything • By specifying a change token, you control what you need
  • 24. #SPSLondon - @eliostruyf Things to know about the change token • First time, create it yourself (ex.: get all changes of the last hour) • Per GetChanges request, you get the latest change token • Store the latest change token, use it for the next call { "ChangeToken": { "StringValue":"1;3;465b36fc-e778-4047-8425-3f906497dfc3;636307074435230000;60879219" }, "ChangeType": 2, "SiteId": "1432d309-9f6a-4dae-8d35-532dec332b86", "ItemId": 3, … }
  • 25. #SPSLondon - @eliostruyf GetChanges response value • Notice the ChangeType, it is an enumeration • 1 = added, 2 = updated, 3 = deleted { "ChangeToken": { "StringValue":"1;3;465b36fc-e778-4047-8425-3f906497dfc3;636307074435230000;60879219" }, "ChangeType": 2, "SiteId": "1432d309-9f6a-4dae-8d35-532dec332b86", "ItemId": 3, "ServerRelativeUrl":"", … "WebId":"e363e4e9-0161-495f-a652-15c618e2e963" } More information about the ChangeTypes - http://elst.es/2ruAfKn
  • 26. #SPSLondon - @eliostruyf Supported event types • Added • Updated • Deleted • CheckedOut • CheckedIn • UncheckedOut • AttachmentAdded • AttachmentDeleted • FileMoved • VersionDeleted • FileConverted
  • 27. #SPSLondon - @eliostruyf Creating your notification service
  • 28.
  • 29.
  • 30. #SPSLondon - @eliostruyf Tokens, all about the OAuth tokens • Azure AD app registration • Generate a certificate • SharePoint requires access tokens with appidacr property set to 2 • Application Authentication Context Class Reference • 0 = Public client • 1 = Identified by a client id and secret • 2 = Identified by a certificate
  • 31. Azure AD application manifest Store this in a separate file (privatekey.pem) Fingerprint is also require to get the access token
  • 32.
  • 33. #SPSLondon - @eliostruyf public getAppOnlyAccessToken(config: IConfig): Promise<any> { return new Promise((resolve, reject) => { const certificate = fs.readFileSync(path.join(__dirname, 'privatekey.pem'), { encoding : 'utf8'}); const authContext = new adal.AuthenticationContext(config.adalConfig.authority); authContext.acquireTokenWithClientCertificate(config.adalConfig.resource, config.adalConfig.clientID, certificate, config.adalConfig.fingerPrint, (err, tokenRes) => { if (err) { reject(err); } const accesstoken = tokenRes.accessToken; resolve(accesstoken); }); }); } Get an access token via a certificate and private key with ADAL for JS
  • 34. #SPSLondon - @eliostruyf Important APIs • Retrieve all list / library subscriptions GET - /_api/web/lists/getbytitle('ListTitle')/subscriptions • Update a subscription PATCH - /_api/web/lists/getbytitle('ListTitle')/subscriptions('${subId}') Body: { "expirationDateTime": "New expiration date" } • Delete a subscription DELETE - /_api/web/lists/getbytitle('ListTitle')/subscriptions('${subId}')
  • 36. #SPSLondon - @eliostruyf A real life setup and configuration SPO config page HTTP Triggered function Queue triggered function 1. Subscribe 2. Validate 3. Trigger change 4. Notify service 5. Put notification message on a queue6. Respond with 200 Use the page to: - Check subscriptions - Update subscriptions - Delete subscriptions 7. Trigger another Azure function that will do change handling 8. Retrieve latest change token10. Store latest change token
  • 38. #SPSLondon - @eliostruyf Recap • Notification service has to respond in < 5 seconds • Retry mechanism  5 times (5 minute delay) • Not for the validation process • Subscription expiration date: 6 months • Create a check or renewal process in your subscription processor • You need to ask for the changes that happened  minimal information is send • Get the changes only what you are interested in • No synchronous events for SPO  event-ing events
  • 40. Office Servers & Services MVP Azure / Office 365 / SharePoint @eliostruyf www.eliostruyf.com info@estruyf.be Elio Struyf Lead trainer and architect
  • 41. #SPSLondon - @eliostruyf Resources Certificate creation process with makecert - http://elst.es/2rhveZc Keycred GitHub - http://elst.es/2pW77vm All about the Change token - http://elst.es/2runG1M ChangeType enumeration - http://elst.es/2ruAfKn ChangeQuery properties - http://elst.es/2rib2q7 C# Sample application - http://elst.es/2qUYg0M Node.js / TypeScript sample application - http://elst.es/2qVpTqT or http://elst.es/2cycM82 SharePoint List WebHooks docs - http://elst.es/2qwl1as - http://elst.es/2quVjD0

Notas del editor

  1. Template may not be modified Twitter hashtag: #SPSLondon for all sessions
  2. https://docs.microsoft.com/en-us/azure/active-directory/develop/active-directory-token-and-claims  appidacr