{"id":2417,"date":"2017-09-10T15:48:15","date_gmt":"2017-09-10T13:48:15","guid":{"rendered":"https:\/\/www.angulararchitects.io\/?p=2417"},"modified":"2017-09-10T15:48:15","modified_gmt":"2017-09-10T13:48:15","slug":"angular-oauth2-oidc-2-1-released","status":"publish","type":"post","link":"https:\/\/www.angulararchitects.io\/en\/blog\/angular-oauth2-oidc-2-1-released\/","title":{"rendered":"Angular-Oauth2-Oidc 2.1 Released"},"content":{"rendered":"<div class=\"article\">\n<p>Over the last weeks, I've worked on version 2.1 of my OpenId Connect (OIDC) certified library <a href=\"https:\/\/www.npmjs.com\/package\/angular-oauth2-oidc\">angular-oauth2-oidc<\/a> which allows for implementing Authentication in Angular using external Identity Providers that support OAuth 2 or OIDC.<\/p>\n<p>Here are the added features:<\/p>\n<ul>\n<li>\nNew Config API (the original one is still supported). This allows putting the whole configuration in an own file:<\/p>\n<div class=\"highlight-source-ts\">\n<pre> <span class=\"pl-c\"><span class=\"pl-c\">\/\/<\/span> auth.config.ts<\/span>\n\n <span class=\"pl-k\">import<\/span> { <span class=\"pl-smi\">AuthConfig<\/span> } <span class=\"pl-k\">from<\/span> <span class=\"pl-s\"><span class=\"pl-pds\">'<\/span>angular-oauth2-oidc<span class=\"pl-pds\">'<\/span><\/span>;\n\n <span class=\"pl-k\">export<\/span> <span class=\"pl-k\">const<\/span> authConfig<span class=\"pl-k\">:<\/span> <span class=\"pl-en\">AuthConfig<\/span> <span class=\"pl-k\">=<\/span> {\n\n   <span class=\"pl-c\"><span class=\"pl-c\">\/\/<\/span> Url of the Identity Provider<\/span>\n   issuer: <span class=\"pl-s\"><span class=\"pl-pds\">'<\/span>https:\/\/steyer-identity-server.azurewebsites.net\/identity<span class=\"pl-pds\">'<\/span><\/span>,\n\n   <span class=\"pl-c\"><span class=\"pl-c\">\/\/<\/span> URL of the SPA to redirect the user to after login<\/span>\n   redirectUri: <span class=\"pl-c1\">window<\/span>.<span class=\"pl-c1\">location<\/span>.<span class=\"pl-smi\">origin<\/span> <span class=\"pl-k\">+<\/span> <span class=\"pl-s\"><span class=\"pl-pds\">'<\/span>\/index.html<span class=\"pl-pds\">'<\/span><\/span>,\n\n   <span class=\"pl-c\"><span class=\"pl-c\">\/\/<\/span> The SPA's id. The SPA is registerd with this id at the auth-server<\/span>\n   clientId: <span class=\"pl-s\"><span class=\"pl-pds\">'<\/span>spa-demo<span class=\"pl-pds\">'<\/span><\/span>,\n\n   <span class=\"pl-c\"><span class=\"pl-c\">\/\/<\/span> set the scope for the permissions the client should request<\/span>\n   <span class=\"pl-c\"><span class=\"pl-c\">\/\/<\/span> The first three are defined by OIDC. The 4th is a usecase-specific one<\/span>\n   scope: <span class=\"pl-s\"><span class=\"pl-pds\">'<\/span>openid profile email voucher<span class=\"pl-pds\">'<\/span><\/span>,\n }<\/pre>\n<\/div>\n<p>After defining the configuration object, you can pass it to the libraries <code>configure<\/code> method:<\/p>\n<div class=\"highlight-source-ts\">\n<pre> <span class=\"pl-k\">import<\/span> { <span class=\"pl-smi\">OAuthService<\/span> } <span class=\"pl-k\">from<\/span> <span class=\"pl-s\"><span class=\"pl-pds\">'<\/span>angular-oauth2-oidc<span class=\"pl-pds\">'<\/span><\/span>;\n <span class=\"pl-k\">import<\/span> { <span class=\"pl-smi\">JwksValidationHandler<\/span> } <span class=\"pl-k\">from<\/span> <span class=\"pl-s\"><span class=\"pl-pds\">'<\/span>angular-oauth2-oidc<span class=\"pl-pds\">'<\/span><\/span>;\n <span class=\"pl-k\">import<\/span> { <span class=\"pl-smi\">authConfig<\/span> } <span class=\"pl-k\">from<\/span> <span class=\"pl-s\"><span class=\"pl-pds\">'<\/span>.\/auth.config<span class=\"pl-pds\">'<\/span><\/span>;\n <span class=\"pl-k\">import<\/span> { <span class=\"pl-smi\">Component<\/span> } <span class=\"pl-k\">from<\/span> <span class=\"pl-s\"><span class=\"pl-pds\">'<\/span>@angular\/core<span class=\"pl-pds\">'<\/span><\/span>;\n\n @<span class=\"pl-en\">Component<\/span>({\n     selector: <span class=\"pl-s\"><span class=\"pl-pds\">'<\/span>flight-app<span class=\"pl-pds\">'<\/span><\/span>,\n     templateUrl: <span class=\"pl-s\"><span class=\"pl-pds\">'<\/span>.\/app.component.html<span class=\"pl-pds\">'<\/span><\/span>\n })\n <span class=\"pl-k\">export<\/span> <span class=\"pl-k\">class<\/span> <span class=\"pl-en\">AppComponent<\/span> {\n\n     <span class=\"pl-k\">constructor<\/span>(<span class=\"pl-k\">private<\/span> <span class=\"pl-v\">oauthService<\/span><span class=\"pl-k\">:<\/span> <span class=\"pl-en\">OAuthService<\/span>) {\n       <span class=\"pl-c1\">this<\/span>.<span class=\"pl-en\">configureWithNewConfigApi<\/span>();\n     }\n\n     <span class=\"pl-k\">private<\/span> configureWithNewConfigApi() {\n       <span class=\"pl-c1\">this<\/span>.<span class=\"pl-smi\">oauthService<\/span>.<span class=\"pl-en\">configure<\/span>(<span class=\"pl-smi\">authConfig<\/span>);\n       <span class=\"pl-c1\">this<\/span>.<span class=\"pl-smi\">oauthService<\/span>.<span class=\"pl-smi\">tokenValidationHandler<\/span> <span class=\"pl-k\">=<\/span> <span class=\"pl-k\">new<\/span> <span class=\"pl-en\">JwksValidationHandler<\/span>();\n       <span class=\"pl-c1\">this<\/span>.<span class=\"pl-smi\">oauthService<\/span>.<span class=\"pl-en\">loadDiscoveryDocumentAndTryLogin<\/span>();\n     }\n }<\/pre>\n<\/div>\n<\/li>\n<li>\nNew convenience methods in OAuthService to streamline default tasks:<\/p>\n<ul>\n<li><code>setupAutomaticSilentRefresh()<\/code><\/li>\n<li><code>loadDiscoveryDocumentAndTryLogin()<\/code><\/li>\n<\/ul>\n<\/li>\n<li>\nSingle Sign out through Session Status Change Notification according to the OpenID Connect Session Management specs. This means, you can be notified when the user logs out using at the login provider:<\/p>\n<p><a href=\"https:\/\/camo.githubusercontent.com\/c1987b133a7d2657000dc288fc14c9626f16611b\/68747470733a2f2f692e696d6775722e636f6d2f78774c714349582e676966\" target=\"_blank\" rel=\"noopener\"><img decoding=\"async\" src=\"https:\/\/camo.githubusercontent.com\/c1987b133a7d2657000dc288fc14c9626f16611b\/68747470733a2f2f692e696d6775722e636f6d2f78774c714349582e676966\" alt=\"Single Sign out via Session Checks\" data-canonical-src=\"https:\/\/i.imgur.com\/xwLqCIX.gif\" style=\"max-width:100%;\"><\/a><\/p>\n<p>To use this feature, your Identity Provider needs to support it. You also have to activate it in the configuration:<\/p>\n<div class=\"highlight-source-ts\">\n<pre> <span class=\"pl-k\">import<\/span> { <span class=\"pl-smi\">AuthConfig<\/span> } <span class=\"pl-k\">from<\/span> <span class=\"pl-s\"><span class=\"pl-pds\">'<\/span>angular-oauth2-oidc<span class=\"pl-pds\">'<\/span><\/span>;\n\n <span class=\"pl-k\">export<\/span> <span class=\"pl-k\">const<\/span> authConfig<span class=\"pl-k\">:<\/span> <span class=\"pl-en\">AuthConfig<\/span> <span class=\"pl-k\">=<\/span> {\n   [<span class=\"pl-k\">...<\/span>]  \n   <span class=\"pl-smi\">sessionChecksEnabled<\/span>: <span class=\"pl-c1\">true<\/span>,\n   sessionCheckIntervall: <span class=\"pl-c1\">3<\/span> <span class=\"pl-k\">*<\/span> <span class=\"pl-c1\">1000<\/span>\n }<\/pre>\n<\/div>\n<p>The optional configuration option <code>sessionCheckIntervall<\/code> which defaults to 3000 msec defines the interval that is used to check whether the user has logged out at the identity provider.\n<\/li>\n<li>\nPossibility to define the <code>ValidationHandler<\/code>, the <code>Config<\/code> as well as the <code>OAuthStorage<\/code> via DI<\/p>\n<div class=\"highlight-source-ts\">\n<pre> [<span class=\"pl-k\">...<\/span>],\n <span class=\"pl-smi\">providers<\/span>: [\n     {provide: <span class=\"pl-smi\">AuthConfig<\/span>, useValue: <span class=\"pl-smi\">authConfig<\/span> },\n     { provide: <span class=\"pl-smi\">OAuthStorage<\/span>, useClass: <span class=\"pl-smi\">DemoStorage<\/span> },\n     { provide: <span class=\"pl-smi\">ValidationHandler<\/span>, useClass: <span class=\"pl-smi\">JwksValidationHandler<\/span> },\n ],\n [<span class=\"pl-k\">...<\/span>]<\/pre>\n<\/div>\n<\/li>\n<li>\nBetter structured documentation:<\/p>\n<p><a href=\"https:\/\/camo.githubusercontent.com\/56dd29402c44f843bb4a8575394d478b426e9cb1\/68747470733a2f2f692e696d6775722e636f6d2f6b42754f6744592e706e67\" target=\"_blank\" rel=\"noopener\"><img decoding=\"async\" src=\"https:\/\/camo.githubusercontent.com\/56dd29402c44f843bb4a8575394d478b426e9cb1\/68747470733a2f2f692e696d6775722e636f6d2f6b42754f6744592e706e67\" alt=\"Documentation\" data-canonical-src=\"https:\/\/i.imgur.com\/kBuOgDY.png\" style=\"max-width:100%;\"><\/a>\n<\/li>\n<\/ul>\n<\/div>\n","protected":false},"excerpt":{"rendered":"<p>Angular-Oauth2-Oidc 2.1 Released<\/p>\n","protected":false},"author":9,"featured_media":2997,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"_price":"","_stock":"","_tribe_ticket_header":"","_tribe_default_ticket_provider":"","_ticket_start_date":"","_ticket_end_date":"","_tribe_ticket_show_description":"","_tribe_ticket_show_not_going":false,"_tribe_ticket_use_global_stock":"","_tribe_ticket_global_stock_level":"","_global_stock_mode":"","_global_stock_cap":"","_tribe_rsvp_for_event":"","_tribe_ticket_going_count":"","_tribe_ticket_not_going_count":"","_tribe_tickets_list":"[]","_tribe_ticket_has_attendee_info_fields":false,"footnotes":""},"categories":[1],"tags":[],"class_list":["post-2417","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-unkategorisiert"],"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.1.1 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Angular-Oauth2-Oidc 2.1 Released - ANGULARarchitects<\/title>\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.angulararchitects.io\/en\/blog\/angular-oauth2-oidc-2-1-released\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Angular-Oauth2-Oidc 2.1 Released - ANGULARarchitects\" \/>\n<meta property=\"og:description\" content=\"Angular-Oauth2-Oidc 2.1 Released\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.angulararchitects.io\/en\/blog\/angular-oauth2-oidc-2-1-released\/\" \/>\n<meta property=\"og:site_name\" content=\"ANGULARarchitects\" \/>\n<meta property=\"article:published_time\" content=\"2017-09-10T13:48:15+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.angulararchitects.io\/wp-content\/uploads\/2019\/04\/blog-2355684-1280.jpg\" \/>\n\t<meta property=\"og:image:width\" content=\"1280\" \/>\n\t<meta property=\"og:image:height\" content=\"853\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/jpeg\" \/>\n<meta name=\"author\" content=\"Manfred Steyer, GDE\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@daniel\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Manfred Steyer, GDE\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"2 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/www.angulararchitects.io\/en\/blog\/angular-oauth2-oidc-2-1-released\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/www.angulararchitects.io\/en\/blog\/angular-oauth2-oidc-2-1-released\/\"},\"author\":{\"name\":\"Manfred Steyer, GDE\",\"@id\":\"https:\/\/www.angulararchitects.io\/en\/#\/schema\/person\/15628efa7af4475ffaaeeb26c5112951\"},\"headline\":\"Angular-Oauth2-Oidc 2.1 Released\",\"datePublished\":\"2017-09-10T13:48:15+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/www.angulararchitects.io\/en\/blog\/angular-oauth2-oidc-2-1-released\/\"},\"wordCount\":175,\"publisher\":{\"@id\":\"https:\/\/www.angulararchitects.io\/en\/#organization\"},\"image\":{\"@id\":\"https:\/\/www.angulararchitects.io\/en\/blog\/angular-oauth2-oidc-2-1-released\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.angulararchitects.io\/wp-content\/uploads\/2019\/04\/blog-2355684-1280.jpg\",\"articleSection\":[\"Unkategorisiert\"],\"inLanguage\":\"en-US\"},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.angulararchitects.io\/en\/blog\/angular-oauth2-oidc-2-1-released\/\",\"url\":\"https:\/\/www.angulararchitects.io\/en\/blog\/angular-oauth2-oidc-2-1-released\/\",\"name\":\"Angular-Oauth2-Oidc 2.1 Released - ANGULARarchitects\",\"isPartOf\":{\"@id\":\"https:\/\/www.angulararchitects.io\/en\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/www.angulararchitects.io\/en\/blog\/angular-oauth2-oidc-2-1-released\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/www.angulararchitects.io\/en\/blog\/angular-oauth2-oidc-2-1-released\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.angulararchitects.io\/wp-content\/uploads\/2019\/04\/blog-2355684-1280.jpg\",\"datePublished\":\"2017-09-10T13:48:15+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/www.angulararchitects.io\/en\/blog\/angular-oauth2-oidc-2-1-released\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.angulararchitects.io\/en\/blog\/angular-oauth2-oidc-2-1-released\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/www.angulararchitects.io\/en\/blog\/angular-oauth2-oidc-2-1-released\/#primaryimage\",\"url\":\"https:\/\/www.angulararchitects.io\/wp-content\/uploads\/2019\/04\/blog-2355684-1280.jpg\",\"contentUrl\":\"https:\/\/www.angulararchitects.io\/wp-content\/uploads\/2019\/04\/blog-2355684-1280.jpg\",\"width\":1280,\"height\":853},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/www.angulararchitects.io\/en\/blog\/angular-oauth2-oidc-2-1-released\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/www.angulararchitects.io\/en\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Angular-Oauth2-Oidc 2.1 Released\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/www.angulararchitects.io\/en\/#website\",\"url\":\"https:\/\/www.angulararchitects.io\/en\/\",\"name\":\"ANGULARarchitects\",\"description\":\"AngularArchitects.io\",\"publisher\":{\"@id\":\"https:\/\/www.angulararchitects.io\/en\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/www.angulararchitects.io\/en\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/www.angulararchitects.io\/en\/#organization\",\"name\":\"ANGULARarchitects\",\"alternateName\":\"SOFTWAREarchitects\",\"url\":\"https:\/\/www.angulararchitects.io\/en\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/www.angulararchitects.io\/en\/#\/schema\/logo\/image\/\",\"url\":\"https:\/\/www.angulararchitects.io\/wp-content\/uploads\/2023\/07\/AA-Logo-RGB-horizontal-inside-knowledge-black.svg\",\"contentUrl\":\"https:\/\/www.angulararchitects.io\/wp-content\/uploads\/2023\/07\/AA-Logo-RGB-horizontal-inside-knowledge-black.svg\",\"width\":644,\"height\":216,\"caption\":\"ANGULARarchitects\"},\"image\":{\"@id\":\"https:\/\/www.angulararchitects.io\/en\/#\/schema\/logo\/image\/\"},\"sameAs\":[\"https:\/\/github.com\/angular-architects\",\"https:\/\/www.linkedin.com\/company\/angular-architects\/\"]},{\"@type\":\"Person\",\"@id\":\"https:\/\/www.angulararchitects.io\/en\/#\/schema\/person\/15628efa7af4475ffaaeeb26c5112951\",\"name\":\"Manfred Steyer, GDE\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/www.angulararchitects.io\/en\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/a0b59539674d8b71ea1c1f4764b11244b5f499203f1d11b40f37d8f3f90be033?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/a0b59539674d8b71ea1c1f4764b11244b5f499203f1d11b40f37d8f3f90be033?s=96&d=mm&r=g\",\"caption\":\"Manfred Steyer, GDE\"},\"sameAs\":[\"https:\/\/x.com\/daniel\"]}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Angular-Oauth2-Oidc 2.1 Released - ANGULARarchitects","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.angulararchitects.io\/en\/blog\/angular-oauth2-oidc-2-1-released\/","og_locale":"en_US","og_type":"article","og_title":"Angular-Oauth2-Oidc 2.1 Released - ANGULARarchitects","og_description":"Angular-Oauth2-Oidc 2.1 Released","og_url":"https:\/\/www.angulararchitects.io\/en\/blog\/angular-oauth2-oidc-2-1-released\/","og_site_name":"ANGULARarchitects","article_published_time":"2017-09-10T13:48:15+00:00","og_image":[{"width":1280,"height":853,"url":"https:\/\/www.angulararchitects.io\/wp-content\/uploads\/2019\/04\/blog-2355684-1280.jpg","type":"image\/jpeg"}],"author":"Manfred Steyer, GDE","twitter_card":"summary_large_image","twitter_creator":"@daniel","twitter_misc":{"Written by":"Manfred Steyer, GDE","Est. reading time":"2 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.angulararchitects.io\/en\/blog\/angular-oauth2-oidc-2-1-released\/#article","isPartOf":{"@id":"https:\/\/www.angulararchitects.io\/en\/blog\/angular-oauth2-oidc-2-1-released\/"},"author":{"name":"Manfred Steyer, GDE","@id":"https:\/\/www.angulararchitects.io\/en\/#\/schema\/person\/15628efa7af4475ffaaeeb26c5112951"},"headline":"Angular-Oauth2-Oidc 2.1 Released","datePublished":"2017-09-10T13:48:15+00:00","mainEntityOfPage":{"@id":"https:\/\/www.angulararchitects.io\/en\/blog\/angular-oauth2-oidc-2-1-released\/"},"wordCount":175,"publisher":{"@id":"https:\/\/www.angulararchitects.io\/en\/#organization"},"image":{"@id":"https:\/\/www.angulararchitects.io\/en\/blog\/angular-oauth2-oidc-2-1-released\/#primaryimage"},"thumbnailUrl":"https:\/\/www.angulararchitects.io\/wp-content\/uploads\/2019\/04\/blog-2355684-1280.jpg","articleSection":["Unkategorisiert"],"inLanguage":"en-US"},{"@type":"WebPage","@id":"https:\/\/www.angulararchitects.io\/en\/blog\/angular-oauth2-oidc-2-1-released\/","url":"https:\/\/www.angulararchitects.io\/en\/blog\/angular-oauth2-oidc-2-1-released\/","name":"Angular-Oauth2-Oidc 2.1 Released - ANGULARarchitects","isPartOf":{"@id":"https:\/\/www.angulararchitects.io\/en\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.angulararchitects.io\/en\/blog\/angular-oauth2-oidc-2-1-released\/#primaryimage"},"image":{"@id":"https:\/\/www.angulararchitects.io\/en\/blog\/angular-oauth2-oidc-2-1-released\/#primaryimage"},"thumbnailUrl":"https:\/\/www.angulararchitects.io\/wp-content\/uploads\/2019\/04\/blog-2355684-1280.jpg","datePublished":"2017-09-10T13:48:15+00:00","breadcrumb":{"@id":"https:\/\/www.angulararchitects.io\/en\/blog\/angular-oauth2-oidc-2-1-released\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.angulararchitects.io\/en\/blog\/angular-oauth2-oidc-2-1-released\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.angulararchitects.io\/en\/blog\/angular-oauth2-oidc-2-1-released\/#primaryimage","url":"https:\/\/www.angulararchitects.io\/wp-content\/uploads\/2019\/04\/blog-2355684-1280.jpg","contentUrl":"https:\/\/www.angulararchitects.io\/wp-content\/uploads\/2019\/04\/blog-2355684-1280.jpg","width":1280,"height":853},{"@type":"BreadcrumbList","@id":"https:\/\/www.angulararchitects.io\/en\/blog\/angular-oauth2-oidc-2-1-released\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.angulararchitects.io\/en\/"},{"@type":"ListItem","position":2,"name":"Angular-Oauth2-Oidc 2.1 Released"}]},{"@type":"WebSite","@id":"https:\/\/www.angulararchitects.io\/en\/#website","url":"https:\/\/www.angulararchitects.io\/en\/","name":"ANGULARarchitects","description":"AngularArchitects.io","publisher":{"@id":"https:\/\/www.angulararchitects.io\/en\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.angulararchitects.io\/en\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Organization","@id":"https:\/\/www.angulararchitects.io\/en\/#organization","name":"ANGULARarchitects","alternateName":"SOFTWAREarchitects","url":"https:\/\/www.angulararchitects.io\/en\/","logo":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.angulararchitects.io\/en\/#\/schema\/logo\/image\/","url":"https:\/\/www.angulararchitects.io\/wp-content\/uploads\/2023\/07\/AA-Logo-RGB-horizontal-inside-knowledge-black.svg","contentUrl":"https:\/\/www.angulararchitects.io\/wp-content\/uploads\/2023\/07\/AA-Logo-RGB-horizontal-inside-knowledge-black.svg","width":644,"height":216,"caption":"ANGULARarchitects"},"image":{"@id":"https:\/\/www.angulararchitects.io\/en\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/github.com\/angular-architects","https:\/\/www.linkedin.com\/company\/angular-architects\/"]},{"@type":"Person","@id":"https:\/\/www.angulararchitects.io\/en\/#\/schema\/person\/15628efa7af4475ffaaeeb26c5112951","name":"Manfred Steyer, GDE","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.angulararchitects.io\/en\/#\/schema\/person\/image\/","url":"https:\/\/secure.gravatar.com\/avatar\/a0b59539674d8b71ea1c1f4764b11244b5f499203f1d11b40f37d8f3f90be033?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/a0b59539674d8b71ea1c1f4764b11244b5f499203f1d11b40f37d8f3f90be033?s=96&d=mm&r=g","caption":"Manfred Steyer, GDE"},"sameAs":["https:\/\/x.com\/daniel"]}]}},"_links":{"self":[{"href":"https:\/\/www.angulararchitects.io\/en\/wp-json\/wp\/v2\/posts\/2417","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.angulararchitects.io\/en\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.angulararchitects.io\/en\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.angulararchitects.io\/en\/wp-json\/wp\/v2\/users\/9"}],"replies":[{"embeddable":true,"href":"https:\/\/www.angulararchitects.io\/en\/wp-json\/wp\/v2\/comments?post=2417"}],"version-history":[{"count":0,"href":"https:\/\/www.angulararchitects.io\/en\/wp-json\/wp\/v2\/posts\/2417\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.angulararchitects.io\/en\/wp-json\/wp\/v2\/media\/2997"}],"wp:attachment":[{"href":"https:\/\/www.angulararchitects.io\/en\/wp-json\/wp\/v2\/media?parent=2417"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.angulararchitects.io\/en\/wp-json\/wp\/v2\/categories?post=2417"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.angulararchitects.io\/en\/wp-json\/wp\/v2\/tags?post=2417"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}