{"id":31128,"date":"2021-09-28T12:55:55","date_gmt":"2021-09-28T11:55:55","guid":{"rendered":"https:\/\/www.inovex.de\/?p=31128"},"modified":"2022-11-21T09:16:19","modified_gmt":"2022-11-21T08:16:19","slug":"single-sign-on-push-benachrichtigung-mit-firebase-cloud-messaging","status":"publish","type":"post","link":"https:\/\/www.inovex.de\/de\/blog\/single-sign-on-push-benachrichtigung-mit-firebase-cloud-messaging\/","title":{"rendered":"Single Sign-On: Push-Benachrichtigung mit Firebase Cloud Messaging"},"content":{"rendered":"<p>In diesem Artikel schauen wir uns an, wie man den Single Sign-On-Dienst von Microsoft mithilfe von Firebase Cloud Messaging um eine Multi-Faktor-Authentifizierung mittels Push-Benachrichtigung erweitern kann.<\/p>\n<p><!--more--><\/p>\n<p>Authentifizierungen sind integraler Bestandteil der digitalen Welt; sie kommen beim On\u00adline\u00adban\u00adking, in den sozialen Netzwerken oder beim Anmelden im Firmennetzwerk zum Einsatz. Sie dienen dem Nachweis einer Identit\u00e4t.<\/p>\n<p>Es hat sich allerdings gezeigt, dass ein gro\u00dfer Teil der Bev\u00f6lkerung bei eben diesen Authentifikationen bei unterschiedlichen Diensten dasselbe oder ein nur leicht ver\u00e4ndertes Passwort verwendet. Dieses Verhaltensmuster ist der Grund, weshalb immer mehr Websites und Firmen auf eine mehrstufige Authentifizierung setzen und ihre Nutzer:innen nach Eingabe des Passwortes um mindestens einen weiteren Faktor beim Anmeldeprozess bitten. Das geschieht beispielsweise durch das Auffordern zur Eingabe einer Zahlenfolge, welche dem Benutzer an seine hinterlegte E-Mail-Adresse zugesandt wird.<\/p>\n<p>Dar\u00fcber hinaus kann durch den Einsatz eines Single Sign-On die Authentifizierungsstelle zentralisiert werden und damit die Anzahl an ben\u00f6tigten Passw\u00f6rtern pro Nutzer:in innerhalb einer Organisation auf ein einziges Passwort reduziert werden.<\/p>\n<div id=\"ez-toc-container\" class=\"ez-toc-v2_0_82_2 counter-hierarchy ez-toc-counter ez-toc-custom ez-toc-container-direction\">\n<div class=\"ez-toc-title-container\"><p class=\"ez-toc-title\" style=\"cursor:inherit\"><\/p>\n<\/div><nav><ul class='ez-toc-list ez-toc-list-level-1 ' ><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-1\" href=\"https:\/\/www.inovex.de\/de\/blog\/single-sign-on-push-benachrichtigung-mit-firebase-cloud-messaging\/#Firebase-Cloud-Messaging\" >Firebase Cloud Messaging<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-2\" href=\"https:\/\/www.inovex.de\/de\/blog\/single-sign-on-push-benachrichtigung-mit-firebase-cloud-messaging\/#Active-Directory-Federation-Services\" >Active Directory Federation Services<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-3\" href=\"https:\/\/www.inovex.de\/de\/blog\/single-sign-on-push-benachrichtigung-mit-firebase-cloud-messaging\/#Proof-of-Concept\" >Proof of Concept<\/a><ul class='ez-toc-list-level-3' ><li class='ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-4\" href=\"https:\/\/www.inovex.de\/de\/blog\/single-sign-on-push-benachrichtigung-mit-firebase-cloud-messaging\/#Backend\" >Backend<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-5\" href=\"https:\/\/www.inovex.de\/de\/blog\/single-sign-on-push-benachrichtigung-mit-firebase-cloud-messaging\/#Firebase-Cloud-Messaging-2\" >Firebase Cloud Messaging<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-6\" href=\"https:\/\/www.inovex.de\/de\/blog\/single-sign-on-push-benachrichtigung-mit-firebase-cloud-messaging\/#Applikation\" >Applikation<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-7\" href=\"https:\/\/www.inovex.de\/de\/blog\/single-sign-on-push-benachrichtigung-mit-firebase-cloud-messaging\/#Demo-Video\" >Demo-Video<\/a><\/li><\/ul><\/li><\/ul><\/nav><\/div>\n<h2><span class=\"ez-toc-section\" id=\"Firebase-Cloud-Messaging\"><\/span>Firebase Cloud Messaging<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p><a href=\"https:\/\/firebase.google.com\/docs\/cloud-messaging\">Firebase Cloud Messaging<\/a> (FCM) erm\u00f6glicht das Senden von cross-plattform Nachrichten f\u00fcr iOS, Android und den Browser.<\/p>\n<p style=\"text-align: left;\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone wp-image-31208\" src=\"https:\/\/www.inovex.de\/wp-content\/uploads\/diagram-FCM-300x169.png\" alt=\"Firebase Cloud Messaging Architektur\" width=\"926\" height=\"522\" srcset=\"https:\/\/www.inovex.de\/wp-content\/uploads\/diagram-FCM-300x169.png 300w, https:\/\/www.inovex.de\/wp-content\/uploads\/diagram-FCM-1024x576.png 1024w, https:\/\/www.inovex.de\/wp-content\/uploads\/diagram-FCM-768x432.png 768w, https:\/\/www.inovex.de\/wp-content\/uploads\/diagram-FCM-1536x864.png 1536w, https:\/\/www.inovex.de\/wp-content\/uploads\/diagram-FCM-400x225.png 400w, https:\/\/www.inovex.de\/wp-content\/uploads\/diagram-FCM-720x406.png 720w, https:\/\/www.inovex.de\/wp-content\/uploads\/diagram-FCM-360x203.png 360w, https:\/\/www.inovex.de\/wp-content\/uploads\/diagram-FCM.png 1920w\" sizes=\"auto, (max-width: 926px) 100vw, 926px\" \/><a href=\"https:\/\/firebase.google.com\/docs\/cloud-messaging\/fcm-architecture\">[1]<\/a><\/p>\n<p>Die von Google entwickelte Cloud-Messaging-L\u00f6sung unterteilt ihre Architektur in drei notwendige Komponenten. Die erste Komponente, in der Abbildung ganz links stehend, ist f\u00fcr das Erstellen der Push-Benachrichtigung zust\u00e4ndig. Sie verpackt in einem Request an das FCM Backend welchen Inhalt, welche(n) Adressat(en) und weitere Konfigurationsm\u00f6glichkeiten die Benachrichtigung enthalten soll. Ein solcher Request kann entweder mithilfe der Notification Console GUI, einer grafischen Testumgebung von FCM oder eines eigenen Servers versendet werden.<\/p>\n<p>Wird sich, wie im Fall dieser Arbeit, f\u00fcr ein eigenes Backend entschieden, so besteht die M\u00f6glichkeit die Anfrage an das FCM Backend per HTTP oder XMPP-Protokoll zu senden oder das Firebase Admin SDK zu verwenden. Benachrichtigungen k\u00f6nnen an einzelne Ger\u00e4te oder an Ger\u00e4tegruppen, welche sich f\u00fcr ein bestimmtes Thema (engl. topic) eingeschrieben haben, gesendet werden. Beim Firebase Admin SDK handelt es sich um eine Reihe von Bibliotheken zur Interaktion mit Firebase.<\/p>\n<p>Die zweite Komponente, die zur Verwendung von FCM notwendig ist, wird von Firebase selbst zur Verf\u00fcgung gestellt und zwar handelt es sich dabei um das FCM Backend. Es stellt u. a. einen Endpunkt zur Verf\u00fcgung, an welchen der zuvor beschriebene Request gesendet werden muss. Dar\u00fcber hinaus ist es f\u00fcr die Verteilung der Nachrichten an die entsprechende Transportschicht (engl. transport layer) zust\u00e4ndig. FCM unterst\u00fctzt das Senden von Benachrichtigungen an Smartphones mit iOS oder Android-Betriebssystem und Browser, welche die Push API implementieren. Die unter Android verwendete Transportschicht ist die Android Transport Layer, unter iOS wird APNs verwendet. Im Web steht Web Push unter Verwendung des Web Push Protokolls zur Verf\u00fcgung.<\/p>\n<p>Zuletzt braucht man eine Applikation, welche das Firebase SDK integriert. Das SDK bietet bspw. die Funktionen zum Generieren des Registrierungstoken, sowie der Interaktion mit eingehenden Benachrichtigungen.<\/p>\n<h2><span class=\"ez-toc-section\" id=\"Active-Directory-Federation-Services\"><\/span>Active Directory Federation Services<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p><a href=\"https:\/\/docs.microsoft.com\/de-de\/windows-server\/identity\/active-directory-federation-services\">Active Directory Federation Services<\/a> (AD FS) ist Microsofts Single Sign-On (SSO) Dienst f\u00fcr Windows Server.<\/p>\n<p>SSO beschreibt hierbei eine Architektur, bei der sich Benutzer bei einer zentralen Authentifizierungsquelle authentifizieren und dadurch ebenfalls bei allen Diensten, welche diese Quelle als vertrauensw\u00fcrdig hinterlegt hat, ohne weitere Interaktion, authentifiziert sind.<br \/>\nIn einer Firma bedeutet das, dass ein Mitarbeiter, welcher in seinem Arbeitsalltag beispielsweise auf ein E-Mail-Programm, einen Online-Kalender und eine Anwendung zur Zeiterfassung zugreifen muss, sich statt jeweiliger Anmeldung an allen drei Systemen, sich nur an einer Stelle authentifiziert und anschlie\u00dfend auf alle genannten Systeme Zugriff hat. Voraussetzung ist, wie bereits erw\u00e4hnt, dass alle weiteren Dienste bei der zentralen Stelle als vertrauensw\u00fcrdige Quellen hinterlegt sein m\u00fcssen.<\/p>\n<p>F\u00fcr die Verwendung des AD FS stehen verschiedene Protokolle, wie SAML. OpenID Connect oder OAuth zur Verf\u00fcgung. Au\u00dferdem erlaubt AD FS die Integration von Azure MFA, Microsofts Cloud-basierter MFA, oder einer selbst implementierten MFA-L\u00f6sung. Eine selbst implementierte MFA-L\u00f6sung, wie sie bei inovex zum Einsatz kommt, wird im AD FS Kontext h\u00e4ufig als Adapter bezeichnet und beruht auf der Implementierung einer .NET Klassenbibliothek (engl. class library) , welche anschlie\u00dfend im AD FS eingebunden wird. Eine Anleitung, wie ein solcher Adapter erstellt wird findet ihr <a href=\"https:\/\/docs.microsoft.com\/de-de\/windows-server\/identity\/ad-fs\/development\/ad-fs-build-custom-auth-method\" target=\"_blank\" rel=\"noopener\">hier<\/a>.<\/p>\n<h2><span class=\"ez-toc-section\" id=\"Proof-of-Concept\"><\/span>Proof of Concept<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>Im Proof of Concept (PoC) dieser Arbeit wurde\u00a0 Firebase Cloud Messaging verwendet, um Push-Benachrichtigungen vom AD FS an Ger\u00e4te zu schicken, welche sich zuvor registriert haben. Die Benachrichtigung wird mithilfe einer <a href=\"https:\/\/capacitorjs.com\/\">Capacitor<\/a>-App und dem Firebase SDK empfangen und angezeigt. Die Kommunikation von der App in Richtung AD FS l\u00e4uft \u00fcber einen <a href=\"https:\/\/developer.mozilla.org\/de\/docs\/Web\/API\/WebSockets_API\" rel=\"\">WebSocket<\/a>.<\/p>\n<h3><span class=\"ez-toc-section\" id=\"Backend\"><\/span>Backend<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<p>Der Server, zum Senden der Benachrichtigung an die entsprechenden Ger\u00e4te, muss ein Windows Server sein, denn AD FS ist ein Dienst, welcher nur auf Windows Servern zur Verf\u00fcgung steht und die Authentifizierung anhand der Daten im Active Directory vornimmt. AD FS steht ab Windows Server 2003 R2 zur Verf\u00fcgung. Der PoC dieser Arbeit beruht auf einem Windows Server 2016 mit installierter AD FS-Rolle. Eine Anleitung zum Aufsetzen eines Windows Servers und zur Installation der AD FS-Rolle findet ihr unter <a href=\"https:\/\/www.anreiter.at\/active-directory-federation-services-adfs-installieren\/\">[2]<\/a> <a href=\"https:\/\/docs.microsoft.com\/de-de\/windows-server\/identity\/ad-fs\/deployment\/install-the-ad-fs-role-service\">[3]<\/a> . Ist der Windows Server und auch die AD FS-Rolle installiert, dann muss der Adapter (weiter oben mit Link) implementiert und anschlie\u00dfend in den AD FS geladen werden.<\/p>\n<p>Zum Senden der Benachrichtigung muss der AD FS-Adapter einen Request an das FCM Backend schicken. So ein Request k\u00f6nnte mithilfe von HTTP v1 wie folgt aussehen:<\/p>\n<pre class=\"\">curl -H 'Authorization: Bearer ' \r\n     -H 'Content-Type: application\/json' \r\n     -d '{\"token\" : \"\",\r\n          \"notification\": {\r\n             \"title\": \"inovex\",\r\n             \"body\": \"Trying to sign in?\"\r\n          },\r\n          \"data\": {\r\n             \"queueName\": \r\n          }\r\n         }'\r\nhttps:\/\/fcm.googleapis.com\/v1\/projects\/\/messages:send<\/pre>\n<div><\/div>\n<p>F\u00fcr das Anzeigen einer Benachrichtigung ist dieser HTTP-Post-Request alles was serverseitig ben\u00f6tigt wird. Er beinhaltet ein oauth2.0-Token, welches\u00a0 euren Server gegen\u00fcber Firebase authentifiziert. In der Payload wird ein Token mit gesendet, dass die Registrierungs-ID eines Ger\u00e4tes beinhaltet, dass sich zuvor f\u00fcr Push-Benachrichtigungen bei eurer Firebase-App registriert hat. Damit Firebase wei\u00df zu welcher App das Registrierungstoken geh\u00f6rt ist der Endpunkt, an den dieser Request geht, eindeutig an euer Projekt in Firebase gekoppelt. Die &lt;project-id&gt; entspricht also der ID, die man in FCM beim Erstellen eines Projektes erh\u00e4lt. Auf das optionale &#8222;data&#8220;-Objekt und die Bedeutung des Attributes &#8222;queueName&#8220; kommen wir sp\u00e4ter noch zu sprechen.<\/p>\n<p>Um eine Antwort der Applikation empfangen zu k\u00f6nnen wurden in dieser Arbeit WebSockets verwendet. Das ist m\u00f6glich, denn der AD FS l\u00e4sst es zu seine Anmeldemaske in einem gewissen Rahmen selbst zu programmieren.\u00a0 Im HTML der vom AD FS ausgelieferten Website wurde die Funktionalit\u00e4t von WebSockets implementiert. Nach dem Absenden der Push-Benachrichtigung wird die Funktion <em>createWebSocket<\/em>() aufgerufen. Sie erm\u00f6glicht es uns ein Ablehnen bzw. Best\u00e4tigen der Push-Benachrichtigung mitzubekommen.<\/p>\n<pre class=\"\">\u00a0function createWebSocket() {\r\n   let webSocket = $(\"#ws\").val();\r\n   let token = $(\"#authToken\").val();\r\n   let header = \"Token=\" + token;\r\n   let totp;\r\n   let socket;\r\n\r\n   \/\/ Websocket uses TLS so query parameter is not accessible to anyone\r\n   socket = new WebSocket(`${webSocket}?${header}`);\r\n   socket.onmessage = function (event) {\r\n     totp = JSON.parse(event.data).totp;\r\n     if (totp) {\r\n       $(\"#challengeQuestionInput\").val(totp);\r\n       $(\"#submitButton\").click();\r\n     }\r\n   };\r\n   socket.onclose = function (event) {\r\n     socket.close();\r\n   };\r\n}<\/pre>\n<h3><span class=\"ez-toc-section\" id=\"Firebase-Cloud-Messaging-2\"><\/span>Firebase Cloud Messaging<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<p>Zu Beginn muss in FCM ein neues Projekt angelegt werden. Diesem Projekt wird die oben beschriebene &lt;project-id&gt; entnommen. Innerhalb des Projektes muss dann f\u00fcr jede Plattform (Android, iOS, Web), an die Benachrichtigungen geschickt werden sollen, eine App-Instanz erstellt werden. In der <a href=\"https:\/\/firebase.google.com\/docs\/cloud-messaging\" rel=\"\">FCM Doku<\/a> findet man dazu eine detaillierte Anleitung.<\/p>\n<p>Empf\u00e4ngt Firebase einen HTTP-Request eures Server, wie im Abschnitt davor beschrieben, dann kann es anhand der Projekt-ID und des Registrierungstoken herausfinden, an welches Ger\u00e4t die Benachrichtigung geschickt werden soll und \u00fcber welche Transportschicht. FCM \u00fcbernimmt dann das Zustellen der Nachricht sobald das Zielger\u00e4t online ist. Ist das Ger\u00e4t nicht online wird die Nachricht in eine Warteschlange gepackt und zugestellt sobald das Ger\u00e4t wieder online ist. Hier besteht die M\u00f6glichkeit, \u00fcber ein TTL (Time to Live)-Attribut im Request anzugeben, wie lange versucht werden soll, die Nachricht zuzustellen, bevor sie verworfen wird.<\/p>\n<h3><span class=\"ez-toc-section\" id=\"Applikation\"><\/span>Applikation<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<p>Bei der in diesem Artikel verwendeten App handelt es sich um eine Angular-App, welche mithilfe der Capacitor Laufzeitumgebung von Ionic sowohl im Browser als auch als native App unter iOS und Android verwendet werden kann.<\/p>\n<p>Im ersten Schritt muss die App sich bei FCM registrieren. Das <a href=\"https:\/\/capacitorjs.com\/docs\/apis\/push-notifications\" rel=\"\">Capacitor-Plugin<\/a> f\u00fcr FCM stellt daf\u00fcr die Funktion <em>requestPermissions<\/em>() bereit. Die Funktion fragt zun\u00e4chst die Berechtigung zum Senden von Push-Benachrichtigungen an und registriert die App-Instanz dann bei FCM. Im Event-Handler &#8222;<em>registration<\/em>&#8220; kann dann der von Firebase ausgestellte Registrierungstoken erhalten werden. Dieser Token ist pro App-Instanz eindeutig und sollte geheim gehalten werden.<\/p>\n<pre class=\"\">\/\/ Request permission to use push notifications\r\n\/\/ iOS will prompt user and return if they granted permission or not\r\n\/\/ Android will just grant without prompting\r\nPushNotifications.requestPermissions().then((result) =&gt; {\r\n  if (result.receive === 'granted') {\r\n    \/\/ Register with Apple \/ Google to receive push via APNS\/FCM\r\n    PushNotifications.register();\r\n    } else {\r\n      \/\/ Show some error\r\n    }\r\n});\r\n\r\nPushNotifications.addListener('registration', (token: Token) =&gt; {\r\n  alert('Push registration success, token: ' + token.value);\r\n});\r\n<\/pre>\n<div><\/div>\n<p>Die App ist nun bereit Push-Benachrichtigungen zu empfangen. Ist die Applikation im Hintergrund oder geschlossen, dann \u00fcbernimmt das Firebase SDK das Anzeigen der Benachrichtigung. Ist die App im Vordergrund, ist sie selbst f\u00fcr das Anzeigen einer passenden Meldung zust\u00e4ndig. Das Plugin stellt auch daf\u00fcr einen Event-Listener zur Verf\u00fcgung, welcher Zugriff auf die gesendete Payload erm\u00f6glicht. Die <a href=\"https:\/\/capacitorjs.com\/docs\/guides\/push-notifications-firebase\" rel=\"\">Capacitor-Dokumentation<\/a> beinhaltet einen ausf\u00fchrlichen Artikel \u00fcber das Integrieren von FCM in eine Angular App.<\/p>\n<pre class=\"\">PushNotifications.addListener(\r\n  'pushNotificationReceived',\r\n\u00a0\u00a0  (notification: PushNotificationSchema) =&gt; {\r\n\u00a0\u00a0\u00a0\u00a0\u00a0  alert('Push received: ' + JSON.stringify(notification));\r\n\u00a0\u00a0\u00a0\u00a0}\r\n);\r\n<\/pre>\n<div><\/div>\n<p>Um den Authentifizierungsvorgang abzuschlie\u00dfen haben wir uns dazu entschieden, ein TOTP (Time based One-Time Password) zu generieren, wenn der Benutzer den Anmeldevorgang best\u00e4tigt. Dieses TOTP wird mithilfe eines WebSockets an eine Message Queue geschickt. Diese Queue hat einen zuf\u00e4llig generierten Namen, welcher ebenfalls \u00fcber die Payload vom AD FS mit gesendet wird. Die Anmeldeseite des AD FS lauscht ab dem Zeitpunkt des Absetzens des HTTP-Request auf dieser Queue. Best\u00e4tigt der Benutzer den Login-Vorgang durch klicken des &#8222;Yes&#8220;-Buttons (s. Demo Video), dann generiert die App einen TOTP und sendet ihn an die entsprechende Message Queue. Das Senden des TOTP entspricht auch wieder nur dem Senden eines HTTP-Post-Request. Wird der Anmeldevorgang abgelehnt, wird ein negativer Wert an die Message Queue geschickt und der Anmeldevorgang endet auf Seiten des AD FS mit einer Fehlermeldung.<\/p>\n<pre class=\"\">curl -H 'X-Token: '\r\n     -d '{\"totp\": \"\"}'\r\nhttps:\/\/msgq.example.com\/publish\/<\/pre>\n<div><\/div>\n<div>Das TOTP kann beispielsweise mit dem NPM-Paket <a href=\"https:\/\/github.com\/yeojz\/otplib\" rel=\"\">otplib <\/a>erstellt werden.<\/div>\n<h3><span class=\"ez-toc-section\" id=\"Demo-Video\"><\/span>Demo-Video<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<p>Fassen wir kurz zusammen, was f\u00fcr die Demo notwendig war.<\/p>\n<ol>\n<li>Windows Server aufsetzen<\/li>\n<li>AD FS installieren<\/li>\n<li>AD FS-Adapter Code schreiben und integrieren<\/li>\n<li>Bei FCM ein Projekt erstellen<\/li>\n<li>In diesem Projekt f\u00fcr jede Plattform eine App erstellen<\/li>\n<li>Eine Angular App mit Capacitor cross-compilieren<\/li>\n<li>Das <a href=\"https:\/\/capacitorjs.com\/docs\/apis\/push-notifications\" rel=\"\">Capacitor-FCM-Plugin<\/a> zum Empfangen der Benachrichtigung installieren<\/li>\n<li>HTTP-Request vom Server an FCM senden<\/li>\n<li>TOTP von der App aus \u00fcber einen WebSocket an eine Message Queue schicken<\/li>\n<li>TOTP auf AD FS-Seite empfangen und validieren<\/li>\n<\/ol>\n<p>&nbsp;<\/p>\n<p>Im Video ist zu sehen, wie die SSO-Seite des AD FS ge\u00f6ffnet wird. Es wird zuerst die Authentifizierung mit Benutzername und Passwort durchgef\u00fchrt, bevor der AD FS den Browser zur MFA-Seite weiterleitet. W\u00e4hlt der Benutzer dann die Option zum Senden einer Push-Benachrichtigung, sendet der AD FS den Request an FCM und die Anmeldeseite verbindet sich gegen den WebSocket. Hat FCM die Nachricht zugestellt, hat der Benutzer die M\u00f6glichkeit die Benachrichtigung durch einen Klick zu \u00f6ffnen. Best\u00e4tigt er den Anmeldevorgang, wird das TOTP an die entsprechende Message Queue geschickt. Schlie\u00dflich wird der Code des &#8222;<em>onmessage<\/em>&#8222;-Event-Handler der WebSocket-Verbindung\u00a0 ausgef\u00fchrt und dadurch das TOTP in das Input-Feld eingef\u00fcgt und die Form submitted . Die MFA ist damit abgeschlossen. Die Validierung des TOTP schl\u00e4gt in diesem Fall fehl, da das in der Testumgebung erstellte TOTP aus Sicherheitsgr\u00fcnden ohne das Shared Secret berechnet wurde.<\/p>\n<div style=\"width: 640px;\" class=\"wp-video\"><video class=\"wp-video-shortcode\" id=\"video-31128-1\" width=\"640\" height=\"360\" preload=\"metadata\" controls=\"controls\"><source type=\"video\/mp4\" src=\"https:\/\/www.inovex.de\/wp-content\/uploads\/poc_demo.mp4?_=1\" \/><a href=\"https:\/\/www.inovex.de\/wp-content\/uploads\/poc_demo.mp4\">https:\/\/www.inovex.de\/wp-content\/uploads\/poc_demo.mp4<\/a><\/video><\/div>\n","protected":false},"excerpt":{"rendered":"<p>In diesem Artikel schauen wir uns an, wie man den Single Sign-On-Dienst von Microsoft mithilfe von Firebase Cloud Messaging um eine Multi-Faktor-Authentifizierung mittels Push-Benachrichtigung erweitern kann.<\/p>\n","protected":false},"author":248,"featured_media":31839,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"inline_featured_image":false,"ep_exclude_from_search":false,"footnotes":""},"tags":[149,128,398,353,101],"service":[420,879],"coauthors":[{"id":248,"display_name":"Kariem Abou-El-Hassan","user_nicename":"kabou-el-hassan"}],"class_list":["post-31128","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","tag-android","tag-angular","tag-ios","tag-mobile","tag-security","service-apps","service-security"],"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.5 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Single Sign-On: Push-Benachrichtigung mit Firebase Cloud Messaging<\/title>\n<meta name=\"description\" content=\"Mit von Firebase Cloud Messaging erweitern wir Microsofts SSO um eine Multi-Faktor-Authentifizierung mittels Push-Benachrichtigung erweitert.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.inovex.de\/de\/blog\/single-sign-on-push-benachrichtigung-mit-firebase-cloud-messaging\/\" \/>\n<meta property=\"og:locale\" content=\"de_DE\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Single Sign-On: Push-Benachrichtigung mit Firebase Cloud Messaging\" \/>\n<meta property=\"og:description\" content=\"Mit von Firebase Cloud Messaging erweitern wir Microsofts SSO um eine Multi-Faktor-Authentifizierung mittels Push-Benachrichtigung erweitert.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.inovex.de\/de\/blog\/single-sign-on-push-benachrichtigung-mit-firebase-cloud-messaging\/\" \/>\n<meta property=\"og:site_name\" content=\"inovex GmbH\" \/>\n<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/inovexde\" \/>\n<meta property=\"article:published_time\" content=\"2021-09-28T11:55:55+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2022-11-21T08:16:19+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.inovex.de\/wp-content\/uploads\/firebase-push-notifications-2fa.png\" \/>\n\t<meta property=\"og:image:width\" content=\"1440\" \/>\n\t<meta property=\"og:image:height\" content=\"810\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"author\" content=\"Kariem Abou-El-Hassan\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:image\" content=\"https:\/\/www.inovex.de\/wp-content\/uploads\/firebase-push-notifications-2fa-1024x576.png\" \/>\n<meta name=\"twitter:creator\" content=\"@inovexgmbh\" \/>\n<meta name=\"twitter:site\" content=\"@inovexgmbh\" \/>\n<meta name=\"twitter:label1\" content=\"Verfasst von\" \/>\n\t<meta name=\"twitter:data1\" content=\"Kariem Abou-El-Hassan\" \/>\n\t<meta name=\"twitter:label2\" content=\"Gesch\u00e4tzte Lesezeit\" \/>\n\t<meta name=\"twitter:data2\" content=\"11\u00a0Minuten\" \/>\n\t<meta name=\"twitter:label3\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data3\" content=\"Kariem Abou-El-Hassan\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/www.inovex.de\\\/de\\\/blog\\\/single-sign-on-push-benachrichtigung-mit-firebase-cloud-messaging\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.inovex.de\\\/de\\\/blog\\\/single-sign-on-push-benachrichtigung-mit-firebase-cloud-messaging\\\/\"},\"author\":{\"name\":\"Kariem Abou-El-Hassan\",\"@id\":\"https:\\\/\\\/www.inovex.de\\\/de\\\/#\\\/schema\\\/person\\\/f1a017f32e2288fd52cb1922e5529a97\"},\"headline\":\"Single Sign-On: Push-Benachrichtigung mit Firebase Cloud Messaging\",\"datePublished\":\"2021-09-28T11:55:55+00:00\",\"dateModified\":\"2022-11-21T08:16:19+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/www.inovex.de\\\/de\\\/blog\\\/single-sign-on-push-benachrichtigung-mit-firebase-cloud-messaging\\\/\"},\"wordCount\":1804,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\\\/\\\/www.inovex.de\\\/de\\\/#organization\"},\"image\":{\"@id\":\"https:\\\/\\\/www.inovex.de\\\/de\\\/blog\\\/single-sign-on-push-benachrichtigung-mit-firebase-cloud-messaging\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/www.inovex.de\\\/wp-content\\\/uploads\\\/firebase-push-notifications-2fa.png\",\"keywords\":[\"Android\",\"Angular\",\"iOS\",\"Mobile\",\"Security\"],\"articleSection\":[\"Applications\",\"General\"],\"inLanguage\":\"de\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/www.inovex.de\\\/de\\\/blog\\\/single-sign-on-push-benachrichtigung-mit-firebase-cloud-messaging\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/www.inovex.de\\\/de\\\/blog\\\/single-sign-on-push-benachrichtigung-mit-firebase-cloud-messaging\\\/\",\"url\":\"https:\\\/\\\/www.inovex.de\\\/de\\\/blog\\\/single-sign-on-push-benachrichtigung-mit-firebase-cloud-messaging\\\/\",\"name\":\"Single Sign-On: Push-Benachrichtigung mit Firebase Cloud Messaging\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.inovex.de\\\/de\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/www.inovex.de\\\/de\\\/blog\\\/single-sign-on-push-benachrichtigung-mit-firebase-cloud-messaging\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/www.inovex.de\\\/de\\\/blog\\\/single-sign-on-push-benachrichtigung-mit-firebase-cloud-messaging\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/www.inovex.de\\\/wp-content\\\/uploads\\\/firebase-push-notifications-2fa.png\",\"datePublished\":\"2021-09-28T11:55:55+00:00\",\"dateModified\":\"2022-11-21T08:16:19+00:00\",\"description\":\"Mit von Firebase Cloud Messaging erweitern wir Microsofts SSO um eine Multi-Faktor-Authentifizierung mittels Push-Benachrichtigung erweitert.\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/www.inovex.de\\\/de\\\/blog\\\/single-sign-on-push-benachrichtigung-mit-firebase-cloud-messaging\\\/#breadcrumb\"},\"inLanguage\":\"de\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/www.inovex.de\\\/de\\\/blog\\\/single-sign-on-push-benachrichtigung-mit-firebase-cloud-messaging\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"de\",\"@id\":\"https:\\\/\\\/www.inovex.de\\\/de\\\/blog\\\/single-sign-on-push-benachrichtigung-mit-firebase-cloud-messaging\\\/#primaryimage\",\"url\":\"https:\\\/\\\/www.inovex.de\\\/wp-content\\\/uploads\\\/firebase-push-notifications-2fa.png\",\"contentUrl\":\"https:\\\/\\\/www.inovex.de\\\/wp-content\\\/uploads\\\/firebase-push-notifications-2fa.png\",\"width\":1440,\"height\":810,\"caption\":\"Illustration Blog Header Artikelbild Schloss Schl\u00fcssel\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/www.inovex.de\\\/de\\\/blog\\\/single-sign-on-push-benachrichtigung-mit-firebase-cloud-messaging\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/www.inovex.de\\\/de\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Single Sign-On: Push-Benachrichtigung mit Firebase Cloud Messaging\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/www.inovex.de\\\/de\\\/#website\",\"url\":\"https:\\\/\\\/www.inovex.de\\\/de\\\/\",\"name\":\"inovex GmbH\",\"description\":\"\",\"publisher\":{\"@id\":\"https:\\\/\\\/www.inovex.de\\\/de\\\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/www.inovex.de\\\/de\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"de\"},{\"@type\":\"Organization\",\"@id\":\"https:\\\/\\\/www.inovex.de\\\/de\\\/#organization\",\"name\":\"inovex GmbH\",\"url\":\"https:\\\/\\\/www.inovex.de\\\/de\\\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"de\",\"@id\":\"https:\\\/\\\/www.inovex.de\\\/de\\\/#\\\/schema\\\/logo\\\/image\\\/\",\"url\":\"https:\\\/\\\/www.inovex.de\\\/wp-content\\\/uploads\\\/2021\\\/03\\\/inovex-logo-16-9-1.png\",\"contentUrl\":\"https:\\\/\\\/www.inovex.de\\\/wp-content\\\/uploads\\\/2021\\\/03\\\/inovex-logo-16-9-1.png\",\"width\":1921,\"height\":1081,\"caption\":\"inovex GmbH\"},\"image\":{\"@id\":\"https:\\\/\\\/www.inovex.de\\\/de\\\/#\\\/schema\\\/logo\\\/image\\\/\"},\"sameAs\":[\"https:\\\/\\\/www.facebook.com\\\/inovexde\",\"https:\\\/\\\/x.com\\\/inovexgmbh\",\"https:\\\/\\\/www.instagram.com\\\/inovexlife\\\/\",\"https:\\\/\\\/www.linkedin.com\\\/company\\\/inovex\",\"https:\\\/\\\/www.youtube.com\\\/channel\\\/UC7r66GT14hROB_RQsQBAQUQ\"]},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/www.inovex.de\\\/de\\\/#\\\/schema\\\/person\\\/f1a017f32e2288fd52cb1922e5529a97\",\"name\":\"Kariem Abou-El-Hassan\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"de\",\"@id\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/0fd6e6ea00922d1113f19a20ecf0a09d19025294565e8e5a74e99f810be40c48?s=96&d=retro&r=ge1771dc455a33cb18ff76701eeb1329c\",\"url\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/0fd6e6ea00922d1113f19a20ecf0a09d19025294565e8e5a74e99f810be40c48?s=96&d=retro&r=g\",\"contentUrl\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/0fd6e6ea00922d1113f19a20ecf0a09d19025294565e8e5a74e99f810be40c48?s=96&d=retro&r=g\",\"caption\":\"Kariem Abou-El-Hassan\"},\"url\":\"https:\\\/\\\/www.inovex.de\\\/de\\\/blog\\\/author\\\/kabou-el-hassan\\\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Single Sign-On: Push-Benachrichtigung mit Firebase Cloud Messaging","description":"Mit von Firebase Cloud Messaging erweitern wir Microsofts SSO um eine Multi-Faktor-Authentifizierung mittels Push-Benachrichtigung erweitert.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.inovex.de\/de\/blog\/single-sign-on-push-benachrichtigung-mit-firebase-cloud-messaging\/","og_locale":"de_DE","og_type":"article","og_title":"Single Sign-On: Push-Benachrichtigung mit Firebase Cloud Messaging","og_description":"Mit von Firebase Cloud Messaging erweitern wir Microsofts SSO um eine Multi-Faktor-Authentifizierung mittels Push-Benachrichtigung erweitert.","og_url":"https:\/\/www.inovex.de\/de\/blog\/single-sign-on-push-benachrichtigung-mit-firebase-cloud-messaging\/","og_site_name":"inovex GmbH","article_publisher":"https:\/\/www.facebook.com\/inovexde","article_published_time":"2021-09-28T11:55:55+00:00","article_modified_time":"2022-11-21T08:16:19+00:00","og_image":[{"width":1440,"height":810,"url":"https:\/\/www.inovex.de\/wp-content\/uploads\/firebase-push-notifications-2fa.png","type":"image\/png"}],"author":"Kariem Abou-El-Hassan","twitter_card":"summary_large_image","twitter_image":"https:\/\/www.inovex.de\/wp-content\/uploads\/firebase-push-notifications-2fa-1024x576.png","twitter_creator":"@inovexgmbh","twitter_site":"@inovexgmbh","twitter_misc":{"Verfasst von":"Kariem Abou-El-Hassan","Gesch\u00e4tzte Lesezeit":"11\u00a0Minuten","Written by":"Kariem Abou-El-Hassan"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.inovex.de\/de\/blog\/single-sign-on-push-benachrichtigung-mit-firebase-cloud-messaging\/#article","isPartOf":{"@id":"https:\/\/www.inovex.de\/de\/blog\/single-sign-on-push-benachrichtigung-mit-firebase-cloud-messaging\/"},"author":{"name":"Kariem Abou-El-Hassan","@id":"https:\/\/www.inovex.de\/de\/#\/schema\/person\/f1a017f32e2288fd52cb1922e5529a97"},"headline":"Single Sign-On: Push-Benachrichtigung mit Firebase Cloud Messaging","datePublished":"2021-09-28T11:55:55+00:00","dateModified":"2022-11-21T08:16:19+00:00","mainEntityOfPage":{"@id":"https:\/\/www.inovex.de\/de\/blog\/single-sign-on-push-benachrichtigung-mit-firebase-cloud-messaging\/"},"wordCount":1804,"commentCount":0,"publisher":{"@id":"https:\/\/www.inovex.de\/de\/#organization"},"image":{"@id":"https:\/\/www.inovex.de\/de\/blog\/single-sign-on-push-benachrichtigung-mit-firebase-cloud-messaging\/#primaryimage"},"thumbnailUrl":"https:\/\/www.inovex.de\/wp-content\/uploads\/firebase-push-notifications-2fa.png","keywords":["Android","Angular","iOS","Mobile","Security"],"articleSection":["Applications","General"],"inLanguage":"de","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.inovex.de\/de\/blog\/single-sign-on-push-benachrichtigung-mit-firebase-cloud-messaging\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.inovex.de\/de\/blog\/single-sign-on-push-benachrichtigung-mit-firebase-cloud-messaging\/","url":"https:\/\/www.inovex.de\/de\/blog\/single-sign-on-push-benachrichtigung-mit-firebase-cloud-messaging\/","name":"Single Sign-On: Push-Benachrichtigung mit Firebase Cloud Messaging","isPartOf":{"@id":"https:\/\/www.inovex.de\/de\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.inovex.de\/de\/blog\/single-sign-on-push-benachrichtigung-mit-firebase-cloud-messaging\/#primaryimage"},"image":{"@id":"https:\/\/www.inovex.de\/de\/blog\/single-sign-on-push-benachrichtigung-mit-firebase-cloud-messaging\/#primaryimage"},"thumbnailUrl":"https:\/\/www.inovex.de\/wp-content\/uploads\/firebase-push-notifications-2fa.png","datePublished":"2021-09-28T11:55:55+00:00","dateModified":"2022-11-21T08:16:19+00:00","description":"Mit von Firebase Cloud Messaging erweitern wir Microsofts SSO um eine Multi-Faktor-Authentifizierung mittels Push-Benachrichtigung erweitert.","breadcrumb":{"@id":"https:\/\/www.inovex.de\/de\/blog\/single-sign-on-push-benachrichtigung-mit-firebase-cloud-messaging\/#breadcrumb"},"inLanguage":"de","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.inovex.de\/de\/blog\/single-sign-on-push-benachrichtigung-mit-firebase-cloud-messaging\/"]}]},{"@type":"ImageObject","inLanguage":"de","@id":"https:\/\/www.inovex.de\/de\/blog\/single-sign-on-push-benachrichtigung-mit-firebase-cloud-messaging\/#primaryimage","url":"https:\/\/www.inovex.de\/wp-content\/uploads\/firebase-push-notifications-2fa.png","contentUrl":"https:\/\/www.inovex.de\/wp-content\/uploads\/firebase-push-notifications-2fa.png","width":1440,"height":810,"caption":"Illustration Blog Header Artikelbild Schloss Schl\u00fcssel"},{"@type":"BreadcrumbList","@id":"https:\/\/www.inovex.de\/de\/blog\/single-sign-on-push-benachrichtigung-mit-firebase-cloud-messaging\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.inovex.de\/de\/"},{"@type":"ListItem","position":2,"name":"Single Sign-On: Push-Benachrichtigung mit Firebase Cloud Messaging"}]},{"@type":"WebSite","@id":"https:\/\/www.inovex.de\/de\/#website","url":"https:\/\/www.inovex.de\/de\/","name":"inovex GmbH","description":"","publisher":{"@id":"https:\/\/www.inovex.de\/de\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.inovex.de\/de\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"de"},{"@type":"Organization","@id":"https:\/\/www.inovex.de\/de\/#organization","name":"inovex GmbH","url":"https:\/\/www.inovex.de\/de\/","logo":{"@type":"ImageObject","inLanguage":"de","@id":"https:\/\/www.inovex.de\/de\/#\/schema\/logo\/image\/","url":"https:\/\/www.inovex.de\/wp-content\/uploads\/2021\/03\/inovex-logo-16-9-1.png","contentUrl":"https:\/\/www.inovex.de\/wp-content\/uploads\/2021\/03\/inovex-logo-16-9-1.png","width":1921,"height":1081,"caption":"inovex GmbH"},"image":{"@id":"https:\/\/www.inovex.de\/de\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/www.facebook.com\/inovexde","https:\/\/x.com\/inovexgmbh","https:\/\/www.instagram.com\/inovexlife\/","https:\/\/www.linkedin.com\/company\/inovex","https:\/\/www.youtube.com\/channel\/UC7r66GT14hROB_RQsQBAQUQ"]},{"@type":"Person","@id":"https:\/\/www.inovex.de\/de\/#\/schema\/person\/f1a017f32e2288fd52cb1922e5529a97","name":"Kariem Abou-El-Hassan","image":{"@type":"ImageObject","inLanguage":"de","@id":"https:\/\/secure.gravatar.com\/avatar\/0fd6e6ea00922d1113f19a20ecf0a09d19025294565e8e5a74e99f810be40c48?s=96&d=retro&r=ge1771dc455a33cb18ff76701eeb1329c","url":"https:\/\/secure.gravatar.com\/avatar\/0fd6e6ea00922d1113f19a20ecf0a09d19025294565e8e5a74e99f810be40c48?s=96&d=retro&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/0fd6e6ea00922d1113f19a20ecf0a09d19025294565e8e5a74e99f810be40c48?s=96&d=retro&r=g","caption":"Kariem Abou-El-Hassan"},"url":"https:\/\/www.inovex.de\/de\/blog\/author\/kabou-el-hassan\/"}]}},"_links":{"self":[{"href":"https:\/\/www.inovex.de\/de\/wp-json\/wp\/v2\/posts\/31128","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.inovex.de\/de\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.inovex.de\/de\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.inovex.de\/de\/wp-json\/wp\/v2\/users\/248"}],"replies":[{"embeddable":true,"href":"https:\/\/www.inovex.de\/de\/wp-json\/wp\/v2\/comments?post=31128"}],"version-history":[{"count":5,"href":"https:\/\/www.inovex.de\/de\/wp-json\/wp\/v2\/posts\/31128\/revisions"}],"predecessor-version":[{"id":37771,"href":"https:\/\/www.inovex.de\/de\/wp-json\/wp\/v2\/posts\/31128\/revisions\/37771"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.inovex.de\/de\/wp-json\/wp\/v2\/media\/31839"}],"wp:attachment":[{"href":"https:\/\/www.inovex.de\/de\/wp-json\/wp\/v2\/media?parent=31128"}],"wp:term":[{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.inovex.de\/de\/wp-json\/wp\/v2\/tags?post=31128"},{"taxonomy":"service","embeddable":true,"href":"https:\/\/www.inovex.de\/de\/wp-json\/wp\/v2\/service?post=31128"},{"taxonomy":"author","embeddable":true,"href":"https:\/\/www.inovex.de\/de\/wp-json\/wp\/v2\/coauthors?post=31128"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}