{"id":1361,"date":"2016-09-01T15:47:14","date_gmt":"2016-09-01T15:47:14","guid":{"rendered":"https:\/\/ionic.io\/blog\/?p=1361"},"modified":"2016-09-08T17:53:57","modified_gmt":"2016-09-08T17:53:57","slug":"google-oauth-changes","status":"publish","type":"post","link":"https:\/\/ionic.io\/blog\/google-oauth-changes","title":{"rendered":"Google OAuth Changes"},"content":{"rendered":"<p>Howdy, everyone! Hope you&#8217;re all doing well. We wanted to fill you in on some new changes coming to Google&#8217;s OAuth policy. Here&#8217;s a <a href=\"https:\/\/developers.googleblog.com\/2016\/08\/modernizing-oauth-interactions-in-native-apps.html\">link to the article<\/a>.<\/p>\n<p>Short Version: Starting October 20, 2016, if you&#8217;re using Google OAuth in a <strong>new app<\/strong>, and it&#8217;s presented through the InAppBrowser plugin, the OAuth request will be denied by Google. On April 20, 2017, all requests through InAppBrowser will be blocked.<\/p>\n<p>Here&#8217;s how to handle this situation in your app.<\/p>\n<p><!--more--><\/p>\n<h3>Google OAuth: the Better Way<\/h3>\n<p>While this may be disconcerting, it&#8217;s actually a great change! We now have the opportunity to create a better sign-in experience for our users that&#8217;s also more secure.<\/p>\n<p>We recommend using the <a href=\"https:\/\/github.com\/EddyVerbruggen\/cordova-plugin-googleplus\">Google Sign-in Plugin<\/a> with Ionic Native. We can use the plugin because the authentication flow uses the native Google SDK and doesn&#8217;t rely on the InAppBrowser plugin.<\/p>\n<p>To get started, we&#8217;re going to need to do a few things first.<\/p>\n<blockquote><p>\n  All of this is covered in the <a href=\"https:\/\/github.com\/EddyVerbruggen\/cordova-plugin-googleplus\/blob\/master\/README.md\">plugin&#8217;s README<\/a>, so this will be an abridged version.\n<\/p><\/blockquote>\n<p>We&#8217;ll focus on iOS for now, since Android is a bit more in-depth, but the plugin&#8217;s README has all the info you&#8217;ll need.<\/p>\n<p>First, we need:<\/p>\n<ul>\n<li>App bundle ID (the reverse domain ID listed in your config.xml)<\/li>\n<li>A Google Developer Account<\/li>\n<\/ul>\n<p>We can navigate to the <a href=\"https:\/\/developers.google.com\/mobile\/add?platform=ios&amp;cntapi=signin\">Google Developer Portal<\/a> and start to add iOS support. We&#8217;ll give the project an app name (typically your app&#8217;s actual name) and bundle ID in our config.xml. It&#8217;s important to note that if we change the bundle ID at any point, we&#8217;ll need to go back and register our app again.<\/p>\n<p><a href=\"https:\/\/ionic.io\/blog\/wp-content\/uploads\/2016\/08\/googleApp.png\"><img loading=\"lazy\" decoding=\"async\" width=\"875\" height=\"573\" data-src=\"https:\/\/ionic.io\/blog\/wp-content\/uploads\/2016\/08\/googleApp.png\" alt=\"googleApp\" class=\"aligncenter size-full wp-image-1362 lazyload\" data-srcset=\"https:\/\/ionic.io\/blog\/wp-content\/uploads\/2016\/08\/googleApp.png 875w, https:\/\/ionic.io\/blog\/wp-content\/uploads\/2016\/08\/googleApp-300x196.png 300w, https:\/\/ionic.io\/blog\/wp-content\/uploads\/2016\/08\/googleApp-768x503.png 768w\" data-sizes=\"auto, (max-width: 875px) 100vw, 875px\" src=\"data:image\/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==\" style=\"--smush-placeholder-width: 875px; --smush-placeholder-aspect-ratio: 875\/573;\" \/><noscript><img loading=\"lazy\" decoding=\"async\" width=\"875\" height=\"573\" src=\"https:\/\/ionic.io\/blog\/wp-content\/uploads\/2016\/08\/googleApp.png\" alt=\"googleApp\" class=\"aligncenter size-full wp-image-1362\" srcset=\"https:\/\/ionic.io\/blog\/wp-content\/uploads\/2016\/08\/googleApp.png 875w, https:\/\/ionic.io\/blog\/wp-content\/uploads\/2016\/08\/googleApp-300x196.png 300w, https:\/\/ionic.io\/blog\/wp-content\/uploads\/2016\/08\/googleApp-768x503.png 768w\" sizes=\"auto, (max-width: 875px) 100vw, 875px\" \/><\/noscript><\/a><\/p>\n<p>Once the information has been entered, we&#8217;ll get a file called <code>GoogleService-info.plist<\/code>, which contains the <code>REVERSED_CLIENT_ID<\/code>. Copy that and paste it down somewhere; we&#8217;ll need it for the plugin installation.<\/p>\n<p>To install the plugin, we&#8217;re going to pull the latest bits from GitHub, instead of what&#8217;s on NPM, because the code on GitHub is more up to date.<\/p>\n<pre><code class=\"bash\">$ ionic plugin add https:\/\/github.com\/EddyVerbruggen\/cordova-plugin-googleplus --save --variable REVERSED_CLIENT_ID=myreversedclientid\n<\/code><\/pre>\n<p>Here, we can replace <code>myreversedclientid<\/code> with the value that&#8217;s in our <code>GoogleService-info.plist<\/code>.<br \/>\nWith the plugin installed, we can now add our logic to authenticate a user.<\/p>\n<h3>The Actual Code<\/h3>\n<p>Now that all the hard work of setting up auth is done, the rest of the work is pretty straightforward. We&#8217;ll use Ionic Native&#8217;s GooglePlus class to do most of the work.<\/p>\n<p>We&#8217;ll create a simple page component with two buttons: one to log in and one to log out. We&#8217;ll also add a card to display some data about the user, once they&#8217;re logged in.<\/p>\n<pre><code class=\"typescript\">import {Component} from &#039;@angular\/core&#039;;\n\n@Component({\n  template: `\n  &lt;ion-content padding&gt;\n    &lt;ion-card *ngIf=&quot;userData&quot;&gt;\n      &lt;ion-card-content&gt;\n        &lt;img class=&quot;profile-img&quot; [hidden]=&quot;!userData&quot; [src]=&quot;userData.imageUrl&quot; \/&gt;\n        &lt;h1&gt;{{userData.displayName}}&lt;\/h1&gt;\n        &lt;p&gt;{{userData.email}}&lt;\/p&gt;\n      &lt;\/ion-card-content&gt;\n    &lt;\/ion-card&gt;\n    &lt;button (click)=&quot;loginUser()&quot;&gt;Login&lt;\/button&gt;\n    &lt;button (click)=&quot;logoutUser()&quot;&gt;Logout&lt;\/button&gt;\n  &lt;\/ion-content&gt;\n  `\n})\nexport class HomePage {\n  public userData;\n}\n<\/code><\/pre>\n<p>Let&#8217;s add an import for GooglePlus.<\/p>\n<pre><code class=\"typescript\">import {Component} form &#039;@angular\/core&#039;;\nimport {GooglePlus} from &#039;ionic-native&#039;;\n<\/code><\/pre>\n<p>Then, we&#8217;ll create two methods, <code>loginUser()<\/code> and <code>logoutUser()<\/code><\/p>\n<p>For <code>loginUser()<\/code>, we&#8217;ll call <code>GooglePlus.login()<\/code><\/p>\n<pre><code class=\"typescript\">  loginUser() {\n    GooglePlus.login({})\n      .then(\n      (res) =&gt; {\n        console.log(&#039;good&#039;);\n        this.userData = res;\n      },\n      (err) =&gt; {\n        console.log(&#039;error&#039;);\n        console.log(err);\n      });\n  }\n\n<\/code><\/pre>\n<p>Login accepts a Scope object, or additional information you require for the authentication session. For now, we can just pass an empty object and handle the promise returns. Here, our card from the template will display the data that gets returned from the login request.<\/p>\n<p>To handle <code>logoutUser()<\/code>, we can just call the <code>logout<\/code> method:<\/p>\n<pre><code class=\"typescript\">  logoutUser() {\n    GooglePlus.logout().then(() =&gt; this.userData = null);\n  }\n<\/code><\/pre>\n<p>Apart from the initial setup, the actual code we need to write is pretty minimal. The plugin thankfully does all of the hard work, while we just have to write a few lines of code!<\/p>\n<p><img decoding=\"async\" width=\"320px\" style=\"--smush-placeholder-width: 750px; --smush-placeholder-aspect-ratio: 750\/1334;display: block; margin:auto; box-shadow: 0px 1px 3px rgba(0,0,0,0.25);\" data-src=\"https:\/\/ionic.io\/blog\/wp-content\/uploads\/2016\/08\/login.gif\" alt=\"reordering\" src=\"data:image\/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==\" class=\"lazyload\" \/><noscript><img decoding=\"async\" width=\"320px\" style=\"display: block; margin:auto; box-shadow: 0px 1px 3px rgba(0,0,0,0.25);\" src=\"https:\/\/ionic.io\/blog\/wp-content\/uploads\/2016\/08\/login.gif\" alt=\"reordering\" \/><\/noscript><\/p>\n<h3>That&#8217;s Cool, but What About Ionic 1?<\/h3>\n<p>While Ionic 2 is great, there are still a lot of apps using Ionic 1. Good news: Ionic Native can also be used in V1! You can install it via Bower or NPM, depending on your setup.<\/p>\n<pre><code>bower install ionic-native --save\n<\/code><\/pre>\n<p>Then add it to your app like this:<\/p>\n<pre><code class=\"javascript\">angular.module(&#039;myApp&#039;, [&#039;ionic&#039;, &#039;ionic.native&#039;])\n\n.controller(&#039;MyCtrl&#039;, function($scope, $cordovaGooglePlus) {\n  $scope.userData;\n  $scope.loginUser = function() {\n    $cordovaGooglePlus.login({})\n    .then(function(res) {\n      console.log(&#039;good&#039;);\n      $scope.userData = res\n    }, function(err) {\n      console.log(&#039;error&#039;);\n      console.log(err);\n    });\n  };\n});\n<\/code><\/pre>\n<h3>Parting Words<\/h3>\n<p>While the change to Google\u2019s policy may seem drastic, the changes you actually need to make to adjust to the new rules are very minimal, and you can keep on making apps the way you&#8217;re used to, for the most part. For folks who use Ionic Cloud&#8217;s Auth features, the Ionic Cloud team is <a href=\"https:\/\/github.com\/driftyco\/ionic-cloud\/issues\/37\">already working on implementing this<\/a> in the client library, and that workaround should be out soon.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Howdy, everyone! Hope you&#8217;re all doing well. We wanted to fill you in on some new changes coming to Google&#8217;s OAuth policy. Here&#8217;s a link to the article. Short Version: Starting October 20, 2016, if you&#8217;re using Google OAuth in a new app, and it&#8217;s presented through the InAppBrowser plugin, the OAuth request will be [&hellip;]<\/p>\n","protected":false},"author":5,"featured_media":0,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"publish_to_discourse":"","publish_post_category":"","wpdc_auto_publish_overridden":"","wpdc_topic_tags":"","wpdc_pin_topic":"","wpdc_pin_until":"","discourse_post_id":"","discourse_permalink":"","wpdc_publishing_response":"","wpdc_publishing_error":"","_jetpack_memberships_contains_paid_content":false,"footnotes":""},"categories":[1],"tags":[14,3,27],"class_list":["post-1361","post","type-post","status-publish","format-standard","hentry","category-all","tag-hybrid-mobile-development","tag-ionic","tag-ionic-native"],"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v23.0 (Yoast SEO v23.0) - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Google OAuth Changes - Ionic Blog<\/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:\/\/ionic.io\/blog\/google-oauth-changes\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Google OAuth Changes\" \/>\n<meta property=\"og:description\" content=\"Howdy, everyone! Hope you&#8217;re all doing well. We wanted to fill you in on some new changes coming to Google&#8217;s OAuth policy. Here&#8217;s a link to the article. Short Version: Starting October 20, 2016, if you&#8217;re using Google OAuth in a new app, and it&#8217;s presented through the InAppBrowser plugin, the OAuth request will be [&hellip;]\" \/>\n<meta property=\"og:url\" content=\"https:\/\/ionic.io\/blog\/google-oauth-changes\" \/>\n<meta property=\"og:site_name\" content=\"Ionic Blog\" \/>\n<meta property=\"article:published_time\" content=\"2016-09-01T15:47:14+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2016-09-08T17:53:57+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/ionic.io\/blog\/wp-content\/uploads\/2016\/08\/googleApp.png\" \/>\n<meta name=\"author\" content=\"Mike Hartington\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@mhartington\" \/>\n<meta name=\"twitter:site\" content=\"@ionicframework\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Mike Hartington\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"4 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/ionic.io\/blog\/google-oauth-changes#article\",\"isPartOf\":{\"@id\":\"https:\/\/ionic.io\/blog\/google-oauth-changes\"},\"author\":{\"name\":\"Mike Hartington\",\"@id\":\"https:\/\/ionic.io\/blog\/#\/schema\/person\/c8c92b04d526adb925ea514c619a267b\"},\"headline\":\"Google OAuth Changes\",\"datePublished\":\"2016-09-01T15:47:14+00:00\",\"dateModified\":\"2016-09-08T17:53:57+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/ionic.io\/blog\/google-oauth-changes\"},\"wordCount\":677,\"commentCount\":17,\"publisher\":{\"@id\":\"https:\/\/ionic.io\/blog\/#organization\"},\"image\":{\"@id\":\"https:\/\/ionic.io\/blog\/google-oauth-changes#primaryimage\"},\"thumbnailUrl\":\"https:\/\/ionic.io\/blog\/wp-content\/uploads\/2016\/08\/googleApp.png\",\"keywords\":[\"hybrid mobile development\",\"Ionic\",\"Ionic Native\"],\"articleSection\":[\"All\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/ionic.io\/blog\/google-oauth-changes#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/ionic.io\/blog\/google-oauth-changes\",\"url\":\"https:\/\/ionic.io\/blog\/google-oauth-changes\",\"name\":\"Google OAuth Changes - Ionic Blog\",\"isPartOf\":{\"@id\":\"https:\/\/ionic.io\/blog\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/ionic.io\/blog\/google-oauth-changes#primaryimage\"},\"image\":{\"@id\":\"https:\/\/ionic.io\/blog\/google-oauth-changes#primaryimage\"},\"thumbnailUrl\":\"https:\/\/ionic.io\/blog\/wp-content\/uploads\/2016\/08\/googleApp.png\",\"datePublished\":\"2016-09-01T15:47:14+00:00\",\"dateModified\":\"2016-09-08T17:53:57+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/ionic.io\/blog\/google-oauth-changes#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/ionic.io\/blog\/google-oauth-changes\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/ionic.io\/blog\/google-oauth-changes#primaryimage\",\"url\":\"https:\/\/ionic.io\/blog\/wp-content\/uploads\/2016\/08\/googleApp.png\",\"contentUrl\":\"https:\/\/ionic.io\/blog\/wp-content\/uploads\/2016\/08\/googleApp.png\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/ionic.io\/blog\/google-oauth-changes#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/ionic.io\/blog\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Google OAuth Changes\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/ionic.io\/blog\/#website\",\"url\":\"https:\/\/ionic.io\/blog\/\",\"name\":\"ionic.io\/blog\",\"description\":\"Build amazing native and progressive web apps with the web\",\"publisher\":{\"@id\":\"https:\/\/ionic.io\/blog\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/ionic.io\/blog\/?s={search_term_string}\"},\"query-input\":\"required name=search_term_string\"}],\"inLanguage\":\"en-US\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/ionic.io\/blog\/#organization\",\"name\":\"Ionic\",\"url\":\"https:\/\/ionic.io\/blog\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/ionic.io\/blog\/#\/schema\/logo\/image\/\",\"url\":\"https:\/\/ionic.io\/blog\/wp-content\/uploads\/2020\/10\/white-on-color.png\",\"contentUrl\":\"https:\/\/ionic.io\/blog\/wp-content\/uploads\/2020\/10\/white-on-color.png\",\"width\":1920,\"height\":854,\"caption\":\"Ionic\"},\"image\":{\"@id\":\"https:\/\/ionic.io\/blog\/#\/schema\/logo\/image\/\"},\"sameAs\":[\"https:\/\/x.com\/ionicframework\"]},{\"@type\":\"Person\",\"@id\":\"https:\/\/ionic.io\/blog\/#\/schema\/person\/c8c92b04d526adb925ea514c619a267b\",\"name\":\"Mike Hartington\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/ionic.io\/blog\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/ionic.io\/blog\/wp-content\/uploads\/2018\/08\/mike-headshot-2-smaller-150x150.png\",\"contentUrl\":\"https:\/\/ionic.io\/blog\/wp-content\/uploads\/2018\/08\/mike-headshot-2-smaller-150x150.png\",\"caption\":\"Mike Hartington\"},\"description\":\"Director of Developer Relations\",\"sameAs\":[\"https:\/\/twitter.com\/mhartington\",\"https:\/\/x.com\/mhartington\"],\"url\":\"https:\/\/ionic.io\/blog\/author\/mike\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Google OAuth Changes - Ionic Blog","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:\/\/ionic.io\/blog\/google-oauth-changes","og_locale":"en_US","og_type":"article","og_title":"Google OAuth Changes","og_description":"Howdy, everyone! Hope you&#8217;re all doing well. We wanted to fill you in on some new changes coming to Google&#8217;s OAuth policy. Here&#8217;s a link to the article. Short Version: Starting October 20, 2016, if you&#8217;re using Google OAuth in a new app, and it&#8217;s presented through the InAppBrowser plugin, the OAuth request will be [&hellip;]","og_url":"https:\/\/ionic.io\/blog\/google-oauth-changes","og_site_name":"Ionic Blog","article_published_time":"2016-09-01T15:47:14+00:00","article_modified_time":"2016-09-08T17:53:57+00:00","og_image":[{"url":"https:\/\/ionic.io\/blog\/wp-content\/uploads\/2016\/08\/googleApp.png"}],"author":"Mike Hartington","twitter_card":"summary_large_image","twitter_creator":"@mhartington","twitter_site":"@ionicframework","twitter_misc":{"Written by":"Mike Hartington","Est. reading time":"4 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/ionic.io\/blog\/google-oauth-changes#article","isPartOf":{"@id":"https:\/\/ionic.io\/blog\/google-oauth-changes"},"author":{"name":"Mike Hartington","@id":"https:\/\/ionic.io\/blog\/#\/schema\/person\/c8c92b04d526adb925ea514c619a267b"},"headline":"Google OAuth Changes","datePublished":"2016-09-01T15:47:14+00:00","dateModified":"2016-09-08T17:53:57+00:00","mainEntityOfPage":{"@id":"https:\/\/ionic.io\/blog\/google-oauth-changes"},"wordCount":677,"commentCount":17,"publisher":{"@id":"https:\/\/ionic.io\/blog\/#organization"},"image":{"@id":"https:\/\/ionic.io\/blog\/google-oauth-changes#primaryimage"},"thumbnailUrl":"https:\/\/ionic.io\/blog\/wp-content\/uploads\/2016\/08\/googleApp.png","keywords":["hybrid mobile development","Ionic","Ionic Native"],"articleSection":["All"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/ionic.io\/blog\/google-oauth-changes#respond"]}]},{"@type":"WebPage","@id":"https:\/\/ionic.io\/blog\/google-oauth-changes","url":"https:\/\/ionic.io\/blog\/google-oauth-changes","name":"Google OAuth Changes - Ionic Blog","isPartOf":{"@id":"https:\/\/ionic.io\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/ionic.io\/blog\/google-oauth-changes#primaryimage"},"image":{"@id":"https:\/\/ionic.io\/blog\/google-oauth-changes#primaryimage"},"thumbnailUrl":"https:\/\/ionic.io\/blog\/wp-content\/uploads\/2016\/08\/googleApp.png","datePublished":"2016-09-01T15:47:14+00:00","dateModified":"2016-09-08T17:53:57+00:00","breadcrumb":{"@id":"https:\/\/ionic.io\/blog\/google-oauth-changes#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/ionic.io\/blog\/google-oauth-changes"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/ionic.io\/blog\/google-oauth-changes#primaryimage","url":"https:\/\/ionic.io\/blog\/wp-content\/uploads\/2016\/08\/googleApp.png","contentUrl":"https:\/\/ionic.io\/blog\/wp-content\/uploads\/2016\/08\/googleApp.png"},{"@type":"BreadcrumbList","@id":"https:\/\/ionic.io\/blog\/google-oauth-changes#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/ionic.io\/blog"},{"@type":"ListItem","position":2,"name":"Google OAuth Changes"}]},{"@type":"WebSite","@id":"https:\/\/ionic.io\/blog\/#website","url":"https:\/\/ionic.io\/blog\/","name":"ionic.io\/blog","description":"Build amazing native and progressive web apps with the web","publisher":{"@id":"https:\/\/ionic.io\/blog\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/ionic.io\/blog\/?s={search_term_string}"},"query-input":"required name=search_term_string"}],"inLanguage":"en-US"},{"@type":"Organization","@id":"https:\/\/ionic.io\/blog\/#organization","name":"Ionic","url":"https:\/\/ionic.io\/blog\/","logo":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/ionic.io\/blog\/#\/schema\/logo\/image\/","url":"https:\/\/ionic.io\/blog\/wp-content\/uploads\/2020\/10\/white-on-color.png","contentUrl":"https:\/\/ionic.io\/blog\/wp-content\/uploads\/2020\/10\/white-on-color.png","width":1920,"height":854,"caption":"Ionic"},"image":{"@id":"https:\/\/ionic.io\/blog\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/x.com\/ionicframework"]},{"@type":"Person","@id":"https:\/\/ionic.io\/blog\/#\/schema\/person\/c8c92b04d526adb925ea514c619a267b","name":"Mike Hartington","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/ionic.io\/blog\/#\/schema\/person\/image\/","url":"https:\/\/ionic.io\/blog\/wp-content\/uploads\/2018\/08\/mike-headshot-2-smaller-150x150.png","contentUrl":"https:\/\/ionic.io\/blog\/wp-content\/uploads\/2018\/08\/mike-headshot-2-smaller-150x150.png","caption":"Mike Hartington"},"description":"Director of Developer Relations","sameAs":["https:\/\/twitter.com\/mhartington","https:\/\/x.com\/mhartington"],"url":"https:\/\/ionic.io\/blog\/author\/mike"}]}},"jetpack_sharing_enabled":true,"jetpack_featured_media_url":"","_links":{"self":[{"href":"https:\/\/ionic.io\/blog\/wp-json\/wp\/v2\/posts\/1361","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/ionic.io\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/ionic.io\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/ionic.io\/blog\/wp-json\/wp\/v2\/users\/5"}],"replies":[{"embeddable":true,"href":"https:\/\/ionic.io\/blog\/wp-json\/wp\/v2\/comments?post=1361"}],"version-history":[{"count":0,"href":"https:\/\/ionic.io\/blog\/wp-json\/wp\/v2\/posts\/1361\/revisions"}],"wp:attachment":[{"href":"https:\/\/ionic.io\/blog\/wp-json\/wp\/v2\/media?parent=1361"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/ionic.io\/blog\/wp-json\/wp\/v2\/categories?post=1361"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/ionic.io\/blog\/wp-json\/wp\/v2\/tags?post=1361"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}