blob: a790fae78f7fbbc0091cb2deb7a9b92ef1dc9f9a [file] [log] [blame]
// Copyright 2013 The Flutter Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
// Authentication. API reference:
// https://developers.google.com/identity/gsi/web/reference/js-reference
// ignore_for_file: non_constant_identifier_names
// * non_constant_identifier_names required to be able to use the same parameter
// names as the underlying library.
@JS()
library google_accounts_id;
import 'package:js/js.dart';
import 'dom.dart';
import 'shared.dart';
/// Binding to the `google.accounts.id` JS global.
///
/// See: https://developers.google.com/identity/gsi/web/reference/js-reference
@JS('google.accounts.id')
external GoogleAccountsId get id;
/// The Dart definition of the `google.accounts.id` global.
@JS()
@staticInterop
abstract class GoogleAccountsId {}
/// The `google.accounts.id` methods
extension GoogleAccountsIdExtension on GoogleAccountsId {
/// An undocumented method.
///
/// Try it with 'debug'.
external void setLogLevel(String level);
/// Initializes the Sign In With Google client based on [IdConfiguration].
///
/// The `initialize` method creates a Sign In With Google client instance that
/// can be implicitly used by all modules in the same web page.
///
/// * You only need to call the `initialize` method once even if you use
/// multiple modules (like One Tap, Personalized button, revocation, etc.) in
/// the same web page.
/// * If you do call the google.accounts.id.initialize method multiple times,
/// only the configurations in the last call will be remembered and used.
///
/// You actually reset the configurations whenever you call the `initialize`
/// method, and all subsequent methods in the same web page will use the new
/// configurations immediately.
///
/// WARNING: The `initialize` method should be called only once, even if you
/// use both One Tap and button in the same web page.
///
/// Method: google.accounts.id.initialize
/// https://developers.google.com/identity/gsi/web/reference/js-reference#google.accounts.id.initialize
external void initialize(IdConfiguration idConfiguration);
/// The `prompt` method displays the One Tap prompt or the browser native
/// credential manager after the [initialize] method is invoked.
///
/// Normally, the `prompt` method is called on page load. Due to the session
/// status and user settings on the Google side, the One Tap prompt UI might
/// not be displayed. To get notified on the UI status for different moments,
/// pass a [PromptMomentListenerFn] to receive UI status notifications.
///
/// Notifications are fired on the following moments:
///
/// * Display moment: This occurs after the `prompt` method is called. The
/// notification contains a boolean value to indicate whether the UI is
/// displayed or not.
/// * Skipped moment: This occurs when the One Tap prompt is closed by an auto
/// cancel, a manual cancel, or when Google fails to issue a credential, such
/// as when the selected session has signed out of Google.
/// In these cases, we recommend that you continue on to the next identity
/// providers, if there are any.
/// * Dismissed moment: This occurs when Google successfully retrieves a
/// credential or a user wants to stop the credential retrieval flow. For
/// example, when the user begins to input their username and password in
/// your login dialog, you can call the [cancel] method to close the One Tap
/// prompt and trigger a dismissed moment.
///
/// WARNING: When on a dismissed moment, do not try any of the next identity
/// providers.
///
/// Method: google.accounts.id.prompt
/// https://developers.google.com/identity/gsi/web/reference/js-reference#google.accounts.id.prompt
external void prompt([PromptMomentListenerFn momentListener]);
/// Renders a Sign In With Google button in your web page.
///
/// Method: google.accounts.id.renderButton
/// https://developers.google.com/identity/gsi/web/reference/js-reference#google.accounts.id.renderButton
external void renderButton(
DomHtmlElement parent, [
GsiButtonConfiguration options,
]);
/// Record when the user signs out of your website in cookies.
///
/// This prevents a UX dead loop.
///
/// Method: google.accounts.id.disableAutoselect
/// https://developers.google.com/identity/gsi/web/reference/js-reference#google.accounts.id.disableAutoSelect
external void disableAutoSelect();
/// A wrapper for the `store` method of the browser's native credential manager API.
///
/// It can only be used to store a Password [Credential].
///
/// See: https://developer.mozilla.org/en-US/docs/Web/API/CredentialsContainer/store
///
/// Method: google.accounts.id.storeCredential
/// https://developers.google.com/identity/gsi/web/reference/js-reference#google.accounts.id.storeCredential
external void storeCredential(Credential credential, [VoidFn fallback]);
/// Cancels the One Tap flow.
///
/// You can cancel the One Tap flow if you remove the prompt from the relying
/// party DOM. The cancel operation is ignored if a credential is already
/// selected.
///
/// Method: google.accounts.id.cancel
/// https://developers.google.com/identity/gsi/web/reference/js-reference#google.accounts.id.cancel
external void cancel();
/// Revokes the OAuth grant used to share the ID token for the specified user.
///
/// [hint] is the email address or unique ID of the user's Google Account. The
/// ID is the `sub` property of the [CredentialResponse.credential] payload.
///
/// The optional [callback] is a function that gets called to report on the
/// success of the revocation call.
///
/// The [callback] parameter must be manually wrapped in [allowInterop]
/// before being passed to the [revoke] function.
///
/// Method: google.accounts.id.revoke
/// https://developers.google.com/identity/gsi/web/reference/js-reference#google.accounts.id.revoke
external void revoke(String hint, [RevocationResponseHandlerFn callback]);
}
/// The configuration object for the [initialize] method.
///
/// Data type: IdConfiguration
/// https://developers.google.com/identity/gsi/web/reference/js-reference#IdConfiguration
@JS()
@anonymous
@staticInterop
abstract class IdConfiguration {
/// Constructs a IdConfiguration object in JavaScript.
///
/// The following properties need to be manually wrapped in [allowInterop]
/// before being passed to this constructor: [callback], [native_callback],
/// and [intermediate_iframe_close_callback].
external factory IdConfiguration({
/// Your application's client ID, which is found and created in the Google
/// Developers Console.
required String client_id,
/// Determines if an ID token is automatically returned without any user
/// interaction when there's only one Google session that has approved your
/// app before. The default value is `false`.
bool? auto_select,
/// The function that handles the ID token returned from the One Tap prompt
/// or the pop-up window. This attribute is required if Google One Tap or
/// the Sign In With Google button `popup` UX mode is used.
CallbackFn? callback,
/// This attribute is the URI of your login endpoint. May be omitted if the
/// current page is your login page, in which case the credential is posted
/// to this page by default.
///
/// The ID token credential response is posted to your login endpoint when
/// a user clicks on the Sign In With Google button and `redirect` UX mode
/// is used.
///
/// Your login endpoint must handle POST requests containing a credential
/// key with an ID token value in the body.
Uri? login_uri,
/// The function that handles the password credential returned from the
/// browser's native credential manager.
NativeCallbackFn? native_callback,
/// Whether or not to cancel the One Tap request if a user clicks outside
/// the prompt. The default value is `true`.
bool? cancel_on_tap_outside,
/// The DOM ID of the container element. If it's not set, the One Tap prompt
/// is displayed in the top-right corner of the window.
String? prompt_parent_id,
/// A random string used by the ID token to prevent replay attacks.
///
/// Nonce length is limited to the maximum JWT size supported by your
/// environment, and individual browser and server HTTP size constraints.
String? nonce,
/// Changes the text of the title and messages in the One Tap prompt.
OneTapContext? context,
/// If you need to display One Tap in the parent domain and its subdomains,
/// pass the parent domain to this field so that a single shared-state
/// cookie is used.
///
/// See: https://developers.google.com/identity/gsi/web/guides/subdomains
String? state_cookie_domain,
/// Set the UX flow used by the Sign In With Google button. The default
/// value is `popup`. **This attribute has no impact on the OneTap UX.**
UxMode? ux_mode,
/// The origins that are allowed to embed the intermediate iframe. One Tap
/// will run in the intermediate iframe mode if this field presents.
///
/// Wildcard prefixes are also supported. Wildcard domains must begin with
/// a secure `https://` scheme, otherwise they'll be considered invalid.
List<String>? allowed_parent_origin,
/// Overrides the default intermediate iframe behavior when users manually
/// close One Tap by tapping on the 'X' button in the One Tap UI. The
/// default behavior is to remove the intermediate iframe from the DOM
/// immediately.
///
/// The `intermediate_iframe_close_callback` field takes effect only in
/// intermediate iframe mode. And it has impact only to the intermediate
/// iframe, instead of the One Tap iframe. The One Tap UI is removed before
/// the callback is invoked.
Function? intermediate_iframe_close_callback,
/// determines if the upgraded One Tap UX should be enabled on browsers
/// that support Intelligent Tracking Prevention (ITP). The default value
/// is false.
///
/// See: https://developers.google.com/identity/gsi/web/guides/features#upgraded_ux_on_itp_browsers
bool? itp_support,
});
}
/// The type of the function that can be passed to [prompt] to listen for [PromptMomentNotification]s.
typedef PromptMomentListenerFn = void Function(PromptMomentNotification moment);
/// A moment (status) notification from the [prompt] method.
///
/// Data type: PromptMomentNotification
/// https://developers.google.com/identity/gsi/web/reference/js-reference#PromptMomentNotification
@JS()
@staticInterop
abstract class PromptMomentNotification {}
/// The methods of the [PromptMomentNotification] data type:
extension PromptMomentNotificationExtension on PromptMomentNotification {
/// Is this notification for a display moment?
external bool isDisplayMoment();
/// Is this notification for a display moment, and the UI is displayed?
external bool isDisplayed();
/// Is this notification for a display moment, and the UI isn't displayed?
external bool isNotDisplayed();
/// Is this notification for a skipped moment?
external bool isSkippedMoment();
/// Is this notification for a dismissed moment?
external bool isDismissedMoment();
@JS('getMomentType')
external String _getMomentType();
@JS('getNotDisplayedReason')
external String? _getNotDisplayedReason();
@JS('getSkippedReason')
external String? _getSkippedReason();
@JS('getDismissedReason')
external String? _getDismissedReason();
/// The moment type.
MomentType getMomentType() => MomentType.values.byName(_getMomentType());
/// The detailed reason why the UI isn't displayed.
MomentNotDisplayedReason? getNotDisplayedReason() =>
maybeEnum(_getNotDisplayedReason(), MomentNotDisplayedReason.values);
/// The detailed reason for the skipped moment.
MomentSkippedReason? getSkippedReason() =>
maybeEnum(_getSkippedReason(), MomentSkippedReason.values);
/// The detailed reason for the dismissal.
MomentDismissedReason? getDismissedReason() =>
maybeEnum(_getDismissedReason(), MomentDismissedReason.values);
}
/// The object passed as the parameter of your [CallbackFn].
///
/// Data type: CredentialResponse
/// https://developers.google.com/identity/gsi/web/reference/js-reference#CredentialResponse
@JS()
@staticInterop
abstract class CredentialResponse {}
/// The fields that are contained in the credential response object.
extension CredentialResponseExtension on CredentialResponse {
/// The ClientID for this Credential.
external String? get client_id;
/// Error while signing in.
external String? get error;
/// Details of the error while signing in.
external String? get error_detail;
/// This field is the ID token as a base64-encoded JSON Web Token (JWT)
/// string.
///
/// See more: https://developers.google.com/identity/gsi/web/reference/js-reference#credential
external String? get credential;
@JS('select_by')
external String? get _select_by;
/// This field sets how the credential was selected.
///
/// The type of button used along with the session and consent state are used
/// to set the value.
///
/// See more: https://developers.google.com/identity/gsi/web/reference/js-reference#select_by
CredentialSelectBy? get select_by =>
maybeEnum(_select_by, CredentialSelectBy.values);
}
/// The type of the `callback` used to create an [IdConfiguration].
///
/// Describes a JavaScript function that handles ID tokens from
/// [CredentialResponse]s.
///
/// Google One Tap and the Sign In With Google button popup UX mode use this
/// attribute.
typedef CallbackFn = void Function(CredentialResponse credentialResponse);
/// The configuration object for the [renderButton] method.
///
/// Data type: GsiButtonConfiguration
/// https://developers.google.com/identity/gsi/web/reference/js-reference#GsiButtonConfiguration
@JS()
@anonymous
@staticInterop
abstract class GsiButtonConfiguration {
/// Constructs an options object for the [renderButton] method.
///
/// The following properties need to be manually wrapped in [allowInterop]
/// before being passed to this constructor:
external factory GsiButtonConfiguration({
/// The button type.
ButtonType type,
/// The button theme.
ButtonTheme theme,
/// The button size.
ButtonSize size,
/// The button text.
ButtonText text,
/// The button shape.
ButtonShape shape,
/// The Google logo alignment in the button.
ButtonLogoAlignment logo_alignment,
/// The minimum button width, in pixels.
///
/// The maximum width is 400 pixels.
double width,
/// The pre-set locale of the button text.
///
/// If not set, the browser's default locale or the Google session user's
/// preference is used.
String locale,
/// A function to be called when the button is clicked.
GsiButtonClickListenerFn click_listener,
});
}
/// The object passed as an optional parameter to `click_listener` function.
@JS()
@staticInterop
abstract class GsiButtonData {}
/// The fields that are contained in the button data.
extension GsiButtonDataExtension on GsiButtonData {
/// Nonce
external String? get nonce;
/// State
external String? get state;
}
/// The type of the [GsiButtonConfiguration] `click_listener` function.
typedef GsiButtonClickListenerFn = void Function(GsiButtonData? gsiButtonData);
/// The object passed to the [NativeCallbackFn]. Represents a PasswordCredential
/// that was returned by the Browser.
///
/// `Credential` objects can also be programmatically created to be stored
/// in the browser through the [storeCredential] method.
///
/// See also: https://developer.mozilla.org/en-US/docs/Web/API/PasswordCredential/PasswordCredential
///
/// Data type: Credential
/// https://developers.google.com/identity/gsi/web/reference/js-reference#type-Credential
@JS()
@anonymous
@staticInterop
abstract class Credential {
///
external factory Credential({
required String id,
required String password,
});
}
/// The fields that are contained in the [Credential] object.
extension CredentialExtension on Credential {
/// Identifies the user.
external String get id;
/// The password.
external String get password;
}
/// The type of the `native_callback` used to create an [IdConfiguration].
///
/// Describes a JavaScript function that handles password [Credential]s coming
/// from the native Credential manager of the user's browser.
typedef NativeCallbackFn = void Function(Credential credential);
/*
// Library load callback: onGoogleLibraryLoad
// https://developers.google.com/identity/gsi/web/reference/js-reference#onGoogleLibraryLoad
// See: `load_callback.dart` and `loader.dart`
*/
/// The type of the `callback` function passed to [revoke], to be notified of
/// the success of the revocation operation.
typedef RevocationResponseHandlerFn = void Function(
RevocationResponse revocationResponse,
);
/// The parameter passed to the `callback` of the [revoke] function.
///
/// Data type: RevocationResponse
/// https://developers.google.com/identity/gsi/web/reference/js-reference#RevocationResponse
@JS()
@staticInterop
abstract class RevocationResponse {}
/// The fields that are contained in the [RevocationResponse] object.
extension RevocationResponseExtension on RevocationResponse {
/// This field is a boolean value set to true if the revoke method call
/// succeeded or false on failure.
external bool get successful;
/// This field is a string value and contains a detailed error message if the
/// revoke method call failed, it is undefined on success.
external String? get error;
}