| Index: appengine/config_service/ui/common/third-party/google-signin-aware.html
|
| diff --git a/appengine/config_service/ui/common/third-party/google-signin-aware.html b/appengine/config_service/ui/common/third-party/google-signin-aware.html
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..e6e731bfad1a7417e19f977e4944c011a4a2f6bd
|
| --- /dev/null
|
| +++ b/appengine/config_service/ui/common/third-party/google-signin-aware.html
|
| @@ -0,0 +1,824 @@
|
| +<!--
|
| +Copyright 2014 Google Inc
|
| +
|
| +Licensed under the Apache License, Version 2.0 (the "License");
|
| +you may not use this file except in compliance with the License.
|
| +You may obtain a copy of the License at
|
| +
|
| + https://www.apache.org/licenses/LICENSE-2.0
|
| +
|
| +Unless required by applicable law or agreed to in writing, software
|
| +distributed under the License is distributed on an "AS IS" BASIS,
|
| +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
| +See the License for the specific language governing permissions and
|
| +limitations under the License.
|
| +-->
|
| +
|
| +<link rel="import" href="../polymer/polymer.html">
|
| +<link rel="import" href="../google-apis/google-js-api.html">
|
| +
|
| +<script>
|
| + (function() {
|
| +
|
| + /**
|
| + * Enum of attributes to be passed through to the login API call.
|
| + * @readonly
|
| + * @enum {string}
|
| + */
|
| + var ProxyLoginAttributes = {
|
| + 'appPackageName': 'apppackagename',
|
| + 'clientId': 'clientid',
|
| + 'cookiePolicy': 'cookiepolicy',
|
| + 'hostedDomain': 'hostedDomain',
|
| + 'openidPrompt': 'prompt',
|
| + 'requestVisibleActions': 'requestvisibleactions'
|
| + };
|
| +
|
| + /**
|
| + * AuthEngine does all interactions with gapi.auth2
|
| + *
|
| + * It is tightly coupled with <google-signin-aware> element
|
| + * The elements configure AuthEngine.
|
| + * AuthEngine propagates all authentication events to all google-signin-aware elements
|
| + *
|
| + * API used: https://developers.google.com/identity/sign-in/web/reference
|
| + *
|
| + */
|
| + var AuthEngine = {
|
| +
|
| + /**
|
| + * oauth2 argument, set by google-signin-aware
|
| + */
|
| + _clientId: null,
|
| +
|
| + get clientId() {
|
| + return this._clientId;
|
| + },
|
| +
|
| + set clientId(val) {
|
| + if (this._clientId && val && val != this._clientId) {
|
| + throw new Error('clientId cannot change. Values do not match. New: ' + val + ' Old:' + this._clientId);
|
| + }
|
| + if (val && val != this._clientId) {
|
| + this._clientId = val;
|
| + this.initAuth2();
|
| + }
|
| + },
|
| +
|
| + /**
|
| + * oauth2 argument, set by google-signin-aware
|
| + */
|
| + _cookiePolicy: 'single_host_origin',
|
| +
|
| + get cookiePolicy() {
|
| + return this._cookiePolicy;
|
| + },
|
| +
|
| + set cookiePolicy(val) {
|
| + if (val) {
|
| + this._cookiePolicy = val;
|
| + }
|
| + },
|
| +
|
| + /**
|
| + * oauth2 argument, set by google-signin-aware
|
| + */
|
| + _appPackageName: '',
|
| +
|
| + get appPackageName() {
|
| + return this._appPackageName;
|
| + },
|
| +
|
| + set appPackageName(val) {
|
| + if (this._appPackageName && val && val != this._appPackageName) {
|
| + throw new Error('appPackageName cannot change. Values do not match. New: ' + val + ' Old: ' + this._appPackageName);
|
| + }
|
| + if (val) {
|
| + this._appPackageName = val;
|
| + }
|
| + },
|
| +
|
| + /**
|
| + * oauth2 argument, set by google-signin-aware
|
| + */
|
| + _requestVisibleActions: '',
|
| +
|
| + get requestVisibleactions() {
|
| + return this._requestVisibleActions;
|
| + },
|
| +
|
| + set requestVisibleactions(val) {
|
| + if (this._requestVisibleActions && val && val != this._requestVisibleActions) {
|
| + throw new Error('requestVisibleactions cannot change. Values do not match. New: ' + val + ' Old: ' + this._requestVisibleActions);
|
| + }
|
| + if (val)
|
| + this._requestVisibleActions = val;
|
| + },
|
| +
|
| + /**
|
| + * oauth2 argument, set by google-signin-aware
|
| + */
|
| + _hostedDomain: '',
|
| +
|
| + get hostedDomain() {
|
| + return this._hostedDomain;
|
| + },
|
| +
|
| + set hostedDomain(val) {
|
| + if (this._hostedDomain && val && val != this._hostedDomain) {
|
| + throw new Error('hostedDomain cannot change. Values do not match. New: ' + val + ' Old: ' + this._hostedDomain);
|
| + }
|
| + if (val)
|
| + this._hostedDomain = val;
|
| + },
|
| +
|
| + /**
|
| + * oauth2 argument, set by google-signin-aware
|
| + */
|
| + _openidPrompt: '',
|
| +
|
| + get openidPrompt() {
|
| + return this._openidPrompt;
|
| + },
|
| +
|
| + set openidPrompt(val) {
|
| + if (typeof val !== 'string') {
|
| + throw new Error(
|
| + 'openidPrompt must be a string. Received ' + typeof val);
|
| + }
|
| + if (val) {
|
| + var values = val.split(' ');
|
| + values = values.map(function(v) {
|
| + return v.trim();
|
| + });
|
| + values = values.filter(function(v) {
|
| + return v;
|
| + });
|
| + var validValues = {none: 0, login: 0, consent: 0, select_account: 0};
|
| + values.forEach(function(v) {
|
| + if (v == 'none' && values.length > 1) {
|
| + throw new Error(
|
| + 'none cannot be combined with other openidPrompt values');
|
| + }
|
| + if (!(v in validValues)) {
|
| + throw new Error(
|
| + 'invalid openidPrompt value ' + v +
|
| + '. Valid values: ' + Object.keys(validValues).join(', '));
|
| + }
|
| + });
|
| + }
|
| + this._openidPrompt = val;
|
| + },
|
| +
|
| + /** Is offline access currently enabled in the google-signin-aware element? */
|
| + _offline: false,
|
| +
|
| + get offline() {
|
| + return this._offline;
|
| + },
|
| +
|
| + set offline(val) {
|
| + this._offline = val;
|
| + this.updateAdditionalAuth();
|
| + },
|
| +
|
| + /** Should we force a re-prompt for offline access? */
|
| + _offlineAlwaysPrompt: false,
|
| +
|
| + get offlineAlwaysPrompt() {
|
| + return this._offlineAlwaysPrompt;
|
| + },
|
| +
|
| + set offlineAlwaysPrompt(val) {
|
| + this._offlineAlwaysPrompt = val;
|
| + this.updateAdditionalAuth();
|
| + },
|
| +
|
| + /** Have we already gotten offline access from Google during this session? */
|
| + offlineGranted: false,
|
| +
|
| + /** <google-js-api> */
|
| + _apiLoader: null,
|
| +
|
| + /** an array of wanted scopes. oauth2 argument */
|
| + _requestedScopeArray: [],
|
| +
|
| + /** _requestedScopeArray as string */
|
| + get requestedScopes() {
|
| + return this._requestedScopeArray.join(' ');
|
| + },
|
| +
|
| + /** Is auth library initalized? */
|
| + _initialized: false,
|
| +
|
| + /** Is user signed in? */
|
| + _signedIn: false,
|
| +
|
| + /** Currently granted scopes */
|
| + _grantedScopeArray: [],
|
| +
|
| + /** True if additional authorization is required */
|
| + _needAdditionalAuth: true,
|
| +
|
| + /** True if have google+ scopes */
|
| + _hasPlusScopes: false,
|
| +
|
| + /**
|
| + * array of <google-signin-aware>
|
| + * state changes are broadcast to them
|
| + */
|
| + signinAwares: [],
|
| +
|
| + init: function() {
|
| + this._apiLoader = document.createElement('google-js-api');
|
| + this._apiLoader.addEventListener('js-api-load', this.loadAuth2.bind(this));
|
| + if (Polymer.Element) {
|
| + document.body.appendChild(this._apiLoader);
|
| + }
|
| + },
|
| +
|
| + loadAuth2: function() {
|
| + gapi.load('auth2', this.initAuth2.bind(this));
|
| + },
|
| +
|
| + initAuth2: function() {
|
| + if (!('gapi' in window) || !('auth2' in window.gapi) || !this.clientId) {
|
| + return;
|
| + }
|
| + var auth = gapi.auth2.init({
|
| + 'client_id': this.clientId,
|
| + 'cookie_policy': this.cookiePolicy,
|
| + 'scope': this.requestedScopes,
|
| + 'hosted_domain': this.hostedDomain
|
| + });
|
| +
|
| + auth['currentUser'].listen(this.handleUserUpdate.bind(this));
|
| +
|
| + auth.then(
|
| + function onFulfilled() {
|
| + // Let the current user listener trigger the changes.
|
| + },
|
| + function onRejected(error) {
|
| + console.error(error);
|
| + }
|
| + );
|
| + },
|
| +
|
| + handleUserUpdate: function(newPrimaryUser) {
|
| + // update and broadcast currentUser
|
| + var isSignedIn = newPrimaryUser.isSignedIn();
|
| + if (isSignedIn != this._signedIn) {
|
| + this._signedIn = isSignedIn;
|
| + for (var i=0; i<this.signinAwares.length; i++) {
|
| + this.signinAwares[i]._setSignedIn(isSignedIn);
|
| + }
|
| + }
|
| + // update and broadcast initialized property the first time the isSignedIn property is set.
|
| + if(!this._initialized) {
|
| + for (var i=0; i<this.signinAwares.length; i++) {
|
| + this.signinAwares[i]._setInitialized(true);
|
| + }
|
| + this._initialized = true;
|
| + }
|
| +
|
| +
|
| + // update granted scopes
|
| + this._grantedScopeArray = this.strToScopeArray(
|
| + newPrimaryUser.getGrantedScopes());
|
| + // console.log(this._grantedScopeArray);
|
| + this.updateAdditionalAuth();
|
| +
|
| + var response = newPrimaryUser.getAuthResponse();
|
| + for (var i=0; i<this.signinAwares.length; i++) {
|
| + this.signinAwares[i]._updateScopeStatus(response);
|
| + }
|
| + },
|
| +
|
| + setOfflineCode: function(code) {
|
| + for (var i=0; i<this.signinAwares.length; i++) {
|
| + this.signinAwares[i]._updateOfflineCode(code);
|
| + }
|
| + },
|
| +
|
| + /** convert scope string to scope array */
|
| + strToScopeArray: function(str) {
|
| + if (!str) {
|
| + return [];
|
| + }
|
| + // remove extra spaces, then split
|
| + var scopes = str.replace(/\ +/g, ' ').trim().split(' ');
|
| + for (var i=0; i<scopes.length; i++) {
|
| + scopes[i] = scopes[i].toLowerCase();
|
| + // Handle scopes that will be deprecated but are still returned with their old value
|
| + if (scopes[i] === 'https://www.googleapis.com/auth/userinfo.profile') {
|
| + scopes[i] = 'profile';
|
| + }
|
| + if (scopes[i] === 'https://www.googleapis.com/auth/userinfo.email') {
|
| + scopes[i] = 'email';
|
| + }
|
| + }
|
| + // return with duplicates filtered out
|
| + return scopes.filter( function(value, index, self) {
|
| + return self.indexOf(value) === index;
|
| + });
|
| + },
|
| +
|
| + /** true if scopes have google+ scopes */
|
| + isPlusScope: function(scope) {
|
| + return (scope.indexOf('/auth/games') > -1)
|
| + || (scope.indexOf('auth/plus.') > -1 && scope.indexOf('auth/plus.me') < 0);
|
| + },
|
| +
|
| + /** true if scopes have been granted */
|
| + hasGrantedScopes: function(scopeStr) {
|
| + var scopes = this.strToScopeArray(scopeStr);
|
| + for (var i=0; i< scopes.length; i++) {
|
| + if (this._grantedScopeArray.indexOf(scopes[i]) === -1)
|
| + return false;
|
| + }
|
| + return true;
|
| + },
|
| +
|
| + /** request additional scopes */
|
| + requestScopes: function(newScopeStr) {
|
| + var newScopes = this.strToScopeArray(newScopeStr);
|
| + var scopesUpdated = false;
|
| + for (var i=0; i<newScopes.length; i++) {
|
| + if (this._requestedScopeArray.indexOf(newScopes[i]) === -1) {
|
| + this._requestedScopeArray.push(newScopes[i]);
|
| + scopesUpdated = true;
|
| + }
|
| + }
|
| + if (scopesUpdated) {
|
| + this.updateAdditionalAuth();
|
| + this.updatePlusScopes();
|
| + }
|
| + },
|
| +
|
| + /** update status of _needAdditionalAuth */
|
| + updateAdditionalAuth: function() {
|
| + var needMoreAuth = false;
|
| + if ((this.offlineAlwaysPrompt || this.offline ) && !this.offlineGranted) {
|
| + needMoreAuth = true;
|
| + } else {
|
| + for (var i=0; i<this._requestedScopeArray.length; i++) {
|
| + if (this._grantedScopeArray.indexOf(this._requestedScopeArray[i]) === -1) {
|
| + needMoreAuth = true;
|
| + break;
|
| + }
|
| + }
|
| + }
|
| + if (this._needAdditionalAuth != needMoreAuth) {
|
| + this._needAdditionalAuth = needMoreAuth;
|
| + // broadcast new value
|
| + for (var i=0; i<this.signinAwares.length; i++) {
|
| + this.signinAwares[i]._setNeedAdditionalAuth(needMoreAuth);
|
| + }
|
| + }
|
| + },
|
| +
|
| + updatePlusScopes: function() {
|
| + var hasPlusScopes = false;
|
| + for (var i = 0; i < this._requestedScopeArray.length; i++) {
|
| + if (this.isPlusScope(this._requestedScopeArray[i])) {
|
| + hasPlusScopes = true;
|
| + break;
|
| + }
|
| + }
|
| + if (this._hasPlusScopes != hasPlusScopes) {
|
| + this._hasPlusScopes = hasPlusScopes;
|
| + for (var i=0; i<this.signinAwares.length; i++) {
|
| + this.signinAwares[i]._setHasPlusScopes(hasPlusScopes);
|
| + }
|
| + }
|
| + },
|
| + /**
|
| + * attached <google-signin-aware>
|
| + * @param {!GoogleSigninAwareElement} aware element to add
|
| + */
|
| + attachSigninAware: function(aware) {
|
| + if (this.signinAwares.indexOf(aware) == -1) {
|
| + this.signinAwares.push(aware);
|
| + // Initialize aware properties
|
| + aware._setNeedAdditionalAuth(this._needAdditionalAuth);
|
| + aware._setInitialized(this._initialized);
|
| + aware._setSignedIn(this._signedIn);
|
| + aware._setHasPlusScopes(this._hasPlusScopes);
|
| + } else {
|
| + console.warn('signinAware attached more than once', aware);
|
| + }
|
| + },
|
| +
|
| + detachSigninAware: function(aware) {
|
| + var index = this.signinAwares.indexOf(aware);
|
| + if (index != -1) {
|
| + this.signinAwares.splice(index, 1);
|
| + } else {
|
| + console.warn('Trying to detach unattached signin-aware');
|
| + }
|
| + },
|
| +
|
| + /** returns scopes not granted */
|
| + getMissingScopes: function() {
|
| + return this._requestedScopeArray.filter( function(scope) {
|
| + return this._grantedScopeArray.indexOf(scope) === -1;
|
| + }.bind(this)).join(' ');
|
| + },
|
| +
|
| + assertAuthInitialized: function() {
|
| + if (!this.clientId) {
|
| + throw new Error("AuthEngine not initialized. clientId has not been configured.");
|
| + }
|
| + if (!('gapi' in window)) {
|
| + throw new Error("AuthEngine not initialized. gapi has not loaded.");
|
| + }
|
| + if (!('auth2' in window.gapi)) {
|
| + throw new Error("AuthEngine not initialized. auth2 not loaded.");
|
| + }
|
| + },
|
| +
|
| + /** pops up sign-in dialog */
|
| + signIn: function() {
|
| + this.assertAuthInitialized();
|
| + var params = {
|
| + 'scope': this.getMissingScopes()
|
| + };
|
| +
|
| + // Proxy specific attributes through to the signIn options.
|
| + Object.keys(ProxyLoginAttributes).forEach(function(key) {
|
| + if (this[key] && this[key] !== '') {
|
| + params[ProxyLoginAttributes[key]] = this[key];
|
| + }
|
| + }, this);
|
| +
|
| + var promise;
|
| + var user = gapi.auth2.getAuthInstance()['currentUser'].get();
|
| + if (!(this.offline || this.offlineAlwaysPrompt)) {
|
| + if (user.getGrantedScopes()) {
|
| + // additional auth, skip multiple account dialog
|
| + promise = user.grant(params);
|
| + } else {
|
| + // initial signin
|
| + promise = gapi.auth2.getAuthInstance().signIn(params);
|
| + }
|
| + } else {
|
| + params.redirect_uri = 'postmessage';
|
| + if (this.offlineAlwaysPrompt) {
|
| + params.approval_prompt = 'force';
|
| + }
|
| +
|
| + // Despite being documented at https://goo.gl/tiO0Bk
|
| + // It doesn't seem like user.grantOfflineAccess() actually exists in
|
| + // the current version of the Google Sign-In JS client we're using
|
| + // through GoogleWebComponents. So in the offline case, we will not
|
| + // distinguish between a first auth and an additional one.
|
| + promise = gapi.auth2.getAuthInstance().grantOfflineAccess(params);
|
| + }
|
| + promise.then(
|
| + function onFulfilled(response) {
|
| + // If login was offline, response contains one string "code"
|
| + // Otherwise it contains the user object already
|
| + var newUser;
|
| + if (response.code) {
|
| + AuthEngine.offlineGranted = true;
|
| + newUser = gapi.auth2.getAuthInstance()['currentUser'].get();
|
| + AuthEngine.setOfflineCode(response.code);
|
| + } else {
|
| + newUser = response;
|
| + }
|
| +
|
| + var authResponse = newUser.getAuthResponse();
|
| + // Let the current user listener trigger the changes.
|
| + },
|
| + function onRejected(error) {
|
| + // Access denied is not an error, user hit cancel
|
| + if ("Access denied." !== error.reason) {
|
| + this.signinAwares.forEach(function(awareInstance) {
|
| + awareInstance.errorNotify(error);
|
| + });
|
| + }
|
| + }.bind(this)
|
| + );
|
| + },
|
| +
|
| + /** signs user out */
|
| + signOut: function() {
|
| + this.assertAuthInitialized();
|
| + gapi.auth2.getAuthInstance().signOut().then(
|
| + function onFulfilled() {
|
| + // Let the current user listener trigger the changes.
|
| + },
|
| + function onRejected(error) {
|
| + console.error(error);
|
| + }
|
| + );
|
| + }
|
| + };
|
| +
|
| + AuthEngine.init();
|
| +
|
| +/**
|
| +`google-signin-aware` is used to enable authentication in custom elements by
|
| +interacting with a google-signin element that needs to be present somewhere
|
| +on the page.
|
| +
|
| +The `scopes` attribute allows you to specify which scope permissions are required
|
| +(e.g do you want to allow interaction with the Google Drive API).
|
| +
|
| +The `google-signin-aware-success` event is triggered when a user successfully
|
| +authenticates. If either `offline` or `offlineAlwaysPrompt` is set to true, successful
|
| +authentication will also trigger the `google-signin-offline-success`event.
|
| +The `google-signin-aware-signed-out` event is triggered when a user explicitly
|
| +signs out via the google-signin element.
|
| +
|
| +You can bind to `isAuthorized` property to monitor authorization state.
|
| +##### Example
|
| +
|
| + <google-signin-aware scopes="https://www.googleapis.com/auth/drive"></google-signin-aware>
|
| +
|
| +
|
| +##### Example with offline
|
| + <template id="awareness" is="dom-bind">
|
| + <google-signin-aware
|
| + scopes="https://www.googleapis.com/auth/drive"
|
| + offline
|
| + on-google-signin-aware-success="handleSignin"
|
| + on-google-signin-offline-success="handleOffline"></google-signin-aware>
|
| + <\/template>
|
| + <script>
|
| + var aware = document.querySelector('#awareness');
|
| + aware.handleSignin = function(response) {
|
| + var user = gapi.auth2.getAuthInstance()['currentUser'].get();
|
| + console.log('User name: ' + user.getBasicProfile().getName());
|
| + };
|
| + aware.handleOffline = function(response) {
|
| + console.log('Offline code received: ' + response.detail.code);
|
| + // Here you would POST response.detail.code to your webserver, which can
|
| + // exchange the authorization code for an access token. More info at:
|
| + // https://developers.google.com/identity/protocols/OAuth2WebServer
|
| + };
|
| + <\/script>
|
| +*/
|
| + Polymer({
|
| +
|
| + is: 'google-signin-aware',
|
| +
|
| + /**
|
| + * Fired when this scope has been authorized
|
| + * @param {Object} result Authorization result.
|
| + * @event google-signin-aware-success
|
| + */
|
| +
|
| + /**
|
| + * Fired when an offline authorization is successful.
|
| + * @param {{code: string}} detail -
|
| + * code: The one-time authorization code from Google.
|
| + * Your application can exchange this for an `access_token` and `refresh_token`
|
| + * @event google-signin-offline-success
|
| + */
|
| +
|
| + /**
|
| + * Fired when this scope is not authorized
|
| + * @event google-signin-aware-signed-out
|
| + */
|
| +
|
| + /**
|
| + * Fired when there is an error during the signin flow.
|
| + * @param {Object} detail The error object returned from the OAuth 2 flow.
|
| + * @event google-signin-aware-error
|
| + */
|
| +
|
| + /**
|
| + * This block is needed so the previous @param is not assigned to the next property.
|
| + */
|
| +
|
| + properties: {
|
| + /**
|
| + * App package name for android over-the-air installs.
|
| + * See the relevant [docs](https://developers.google.com/+/web/signin/android-app-installs)
|
| + */
|
| + appPackageName: {
|
| + type: String,
|
| + observer: '_appPackageNameChanged'
|
| + },
|
| +
|
| + /**
|
| + * a Google Developers clientId reference
|
| + */
|
| + clientId: {
|
| + type: String,
|
| + observer: '_clientIdChanged'
|
| + },
|
| +
|
| + /**
|
| + * The cookie policy defines what URIs have access to the session cookie
|
| + * remembering the user's sign-in state.
|
| + * See the relevant [docs](https://developers.google.com/+/web/signin/reference#determining_a_value_for_cookie_policy) for more information.
|
| + * @default 'single_host_origin'
|
| + */
|
| + cookiePolicy: {
|
| + type: String,
|
| + observer: '_cookiePolicyChanged'
|
| + },
|
| +
|
| + /**
|
| + * The app activity types you want to write on behalf of the user
|
| + * (e.g http://schemas.google.com/AddActivity)
|
| + *
|
| + */
|
| + requestVisibleActions: {
|
| + type: String,
|
| + observer: '_requestVisibleActionsChanged'
|
| + },
|
| +
|
| + /**
|
| + * The Google Apps domain to which users must belong to sign in.
|
| + * See the relevant [docs](https://developers.google.com/identity/sign-in/web/reference) for more information.
|
| + */
|
| + hostedDomain: {
|
| + type: String,
|
| + observer: '_hostedDomainChanged'
|
| + },
|
| +
|
| + /**
|
| + * Allows for offline `access_token` retrieval during the signin process.
|
| + * See also `offlineAlwaysPrompt`. You only need to set one of the two; if both
|
| + * are set, the behavior of `offlineAlwaysPrompt` will override `offline`.
|
| + */
|
| + offline: {
|
| + type: Boolean,
|
| + value: false,
|
| + observer: '_offlineChanged'
|
| + },
|
| +
|
| + /**
|
| + * Works the same as `offline` with the addition that it will always
|
| + * force a re-prompt to the user, guaranteeing that you will get a
|
| + * refresh_token even if the user has already granted offline access to
|
| + * this application. You only need to set one of `offline` or
|
| + * `offlineAlwaysPrompt`, not both.
|
| + */
|
| + offlineAlwaysPrompt: {
|
| + type: Boolean,
|
| + value: false,
|
| + observer: '_offlineAlwaysPromptChanged'
|
| + },
|
| +
|
| + /**
|
| + * The scopes to provide access to (e.g https://www.googleapis.com/auth/drive)
|
| + * and should be space-delimited.
|
| + */
|
| + scopes: {
|
| + type: String,
|
| + value: 'profile',
|
| + observer: '_scopesChanged'
|
| + },
|
| +
|
| + /**
|
| + * Space-delimited, case-sensitive list of strings that
|
| + * specifies whether the the user is prompted for reauthentication
|
| + * and/or consent. The defined values are:
|
| + * none: do not display authentication or consent pages.
|
| + * This value is mutually exclusive with the rest.
|
| + * login: always prompt the user for reauthentication.
|
| + * consent: always show consent screen.
|
| + * select_account: always show account selection page.
|
| + * This enables a user who has multiple accounts to select amongst
|
| + * the multiple accounts that they might have current sessions for.
|
| + * For more information, see "prompt" parameter description in
|
| + * https://openid.net/specs/openid-connect-basic-1_0.html#RequestParameters
|
| + */
|
| + openidPrompt: {
|
| + type: String,
|
| + value: '',
|
| + observer: '_openidPromptChanged'
|
| + },
|
| +
|
| + /**
|
| + * True when the auth library has been initialized, and signedIn property value is set from the first api response.
|
| + */
|
| + initialized: {
|
| + type: Boolean,
|
| + notify: true,
|
| + readOnly: true
|
| + },
|
| +
|
| + /**
|
| + * True if user is signed in
|
| + */
|
| + signedIn: {
|
| + type: Boolean,
|
| + notify: true,
|
| + readOnly: true
|
| + },
|
| +
|
| + /**
|
| + * True if authorizations for *this* element have been granted
|
| + */
|
| + isAuthorized: {
|
| + type: Boolean,
|
| + notify: true,
|
| + readOnly: true,
|
| + value: false
|
| + },
|
| +
|
| + /**
|
| + * True if additional authorizations for *any* element are required
|
| + */
|
| + needAdditionalAuth: {
|
| + type: Boolean,
|
| + notify: true,
|
| + readOnly: true
|
| + },
|
| +
|
| + /**
|
| + * True if *any* element has google+ scopes
|
| + */
|
| + hasPlusScopes: {
|
| + type: Boolean,
|
| + value: false,
|
| + notify: true,
|
| + readOnly: true
|
| + }
|
| + },
|
| +
|
| + attached: function() {
|
| + AuthEngine.attachSigninAware(this);
|
| + },
|
| +
|
| + detached: function() {
|
| + AuthEngine.detachSigninAware(this);
|
| + },
|
| +
|
| + /** pops up the authorization dialog */
|
| + signIn: function() {
|
| + AuthEngine.signIn();
|
| + },
|
| +
|
| + /** signs user out */
|
| + signOut: function() {
|
| + AuthEngine.signOut();
|
| + },
|
| +
|
| + errorNotify: function(error) {
|
| + this.fire('google-signin-aware-error', error);
|
| + },
|
| +
|
| + _appPackageNameChanged: function(newName, oldName) {
|
| + AuthEngine.appPackageName = newName;
|
| + },
|
| +
|
| + _clientIdChanged: function(newId, oldId) {
|
| + AuthEngine.clientId = newId;
|
| + },
|
| +
|
| + _cookiePolicyChanged: function(newPolicy, oldPolicy) {
|
| + AuthEngine.cookiePolicy = newPolicy;
|
| + },
|
| +
|
| + _requestVisibleActionsChanged: function(newVal, oldVal) {
|
| + AuthEngine.requestVisibleActions = newVal;
|
| + },
|
| +
|
| + _hostedDomainChanged: function(newVal, oldVal) {
|
| + AuthEngine.hostedDomain = newVal;
|
| + },
|
| +
|
| + _offlineChanged: function(newVal, oldVal) {
|
| + AuthEngine.offline = newVal;
|
| + },
|
| +
|
| + _offlineAlwaysPromptChanged: function(newVal, oldVal) {
|
| + AuthEngine.offlineAlwaysPrompt = newVal;
|
| + },
|
| +
|
| + _scopesChanged: function(newVal, oldVal) {
|
| + AuthEngine.requestScopes(newVal);
|
| + this._updateScopeStatus(undefined);
|
| + },
|
| +
|
| + _openidPromptChanged: function(newVal, oldVal) {
|
| + AuthEngine.openidPrompt = newVal;
|
| + },
|
| +
|
| + _updateScopeStatus: function(user) {
|
| + var newAuthorized = this.signedIn && AuthEngine.hasGrantedScopes(this.scopes);
|
| + if (newAuthorized !== this.isAuthorized) {
|
| + this._setIsAuthorized(newAuthorized);
|
| + if (newAuthorized) {
|
| + this.fire('google-signin-aware-success', user);
|
| + }
|
| + else {
|
| + this.fire('google-signin-aware-signed-out', user);
|
| + }
|
| + }
|
| + },
|
| +
|
| + _updateOfflineCode: function(code) {
|
| + if (code) {
|
| + this.fire('google-signin-offline-success', {code: code});
|
| + }
|
| + }
|
| + });
|
| + })();
|
| +</script>
|
|
|