UNPKG

36.6 kBMarkdownView Raw
1[![NPM version][npm-image]][npm-url]
2[![Build status][circleci-image]][circleci-url]
3[![Dependency Status][david-image]][david-url]
4[![License][license-image]][license-url]
5[![Downloads][downloads-image]][downloads-url]
6[![FOSSA Status](https://app.fossa.com/api/projects/git%2Bgithub.com%2Fauth0%2Flock.svg?type=shield)](https://app.fossa.com/projects/git%2Bgithub.com%2Fauth0%2Flock?ref=badge_shield)
7
8# Lock
9
10[Auth0](https://auth0.com) is an authentication broker that supports both social and enterprise identity providers, including Active Directory, LDAP, Google Apps, and Salesforce.
11
12## Table of Contents
13
141. [Install](#install)
152. [Cross Origin Authentication](#cross-origin-authentication)
163. [API](#api)
174. [Browser Compatibility](#browser-compatibility)
185. [Issue Reporting](#issue-reporting)
196. [Author](#author)
207. [License](#license)
21
22## Install
23
24From CDN
25
26```html
27<!-- Latest patch release (recommended for production) -->
28<script src="https://cdn.auth0.com/js/lock/11.30.6/lock.min.js"></script>
29```
30
31From [npm](https://npmjs.org)
32
33```sh
34npm install auth0-lock
35```
36
37Then you can import `Auth0Lock` or `Auth0LockPasswordless` like this:
38
39```js
40import Auth0Lock from 'auth0-lock';
41// OR
42import { Auth0Lock } from 'auth0-lock';
43import { Auth0LockPasswordless } from 'auth0-lock';
44```
45
46After installing the `auth0-lock` module, you'll need to bundle it up along with all of its dependencies. See examples for [browserify](examples/bundling/browserify/) and [webpack](examples/bundling/webpack/).
47
48> It is expected that you use the development mode when working on your app, and the production mode when deploying your app to the users.
49> You can find instructions for building your app for production with different module bundlers [here](https://reactjs.org/docs/optimizing-performance.html#use-the-production-build).
50
51If you are targeting mobile audiences, we recommended that you add:
52
53```html
54<meta name="viewport" content="width=device-width, initial-scale=1" />
55```
56
57## Cross-Origin Authentication
58
59Lock uses **Cross-Origin Authentication**, make sure you understand the considerations you need to take into account by reading the [Cross-Origin Authentication documentation](https://auth0.com/docs/cross-origin-authentication).
60
61## API
62
63### new Auth0Lock(clientID, domain, options)
64
65Initializes a new instance of `Auth0Lock` configured with your application `clientID` and your account's `domain` at [Auth0](https://manage.auth0.com/). You can find this information in your [application settings](https://manage.auth0.com/#/applications).
66
67- **clientId {String}**: Your application _clientId_ in Auth0.
68- **domain {String}**: Your Auth0 _domain_. Usually _your-account.auth0.com_.
69- **options {Object}**: Allows you to customize the dialog's appearance and behavior. See [below](#customization) for the details.
70
71#### Example
72
73```js
74var clientId = 'YOUR_AUTH0_APP_CLIENTID';
75var domain = 'YOUR_DOMAIN_AT.auth0.com';
76var lock = new Auth0Lock(clientId, domain);
77var accessToken = null;
78var profile = null;
79
80lock.on('authenticated', function (authResult) {
81 lock.getUserInfo(authResult.accessToken, function (error, profileResult) {
82 if (error) {
83 // Handle error
84 return;
85 }
86
87 accessToken = authResult.accessToken;
88 profile = profileResult;
89
90 // Update DOM
91 });
92});
93```
94
95### new Auth0LockPasswordless(clientID, domain, options)
96
97Initializes a new instance of `Auth0LockPasswordless` configured with your application `clientID` and your account's `domain` at [Auth0](https://manage.auth0.com/). You can find this information in your [application settings](https://manage.auth0.com/#/applications).
98
99- **clientId {String}**: Your application _clientId_ in Auth0.
100- **domain {String}**: Your Auth0 _domain_. Usually _your-account.auth0.com_.
101- **options {Object}**: Allows you to customize the dialog's appearance and behavior. See [below](#customization) for the details.
102
103If both SMS and email passwordless connections are enabled [in the dashboard](https://manage.auth0.com/#/connections/passwordless), Lock will pick email by default. If you want to conditionally pick email or SMS, use the [`allowedConnections`](#ui-options) option, for example: `allowedConnections: ['sms']`.
104
105If using an [additional passwordless connection](#additional-passwordless-connections) that has been created through the Management API, you must specify the connection in `allowedConnections` and also enable the `useCustomPasswordlessConnection` flag in the options.
106
107For more information, read our [passwordless docs](https://auth0.com/docs/connections/passwordless).
108
109#### Example
110
111```js
112var clientId = 'YOUR_AUTH0_APP_CLIENTID';
113var domain = 'YOUR_DOMAIN_AT.auth0.com';
114var lock = new Auth0LockPasswordless(clientId, domain);
115var accessToken = null;
116var profile = null;
117
118lock.on('authenticated', function (authResult) {
119 lock.getUserInfo(authResult.accessToken, function (error, profileResult) {
120 if (error) {
121 // Handle error
122 return;
123 }
124
125 accessToken = authResult.accessToken;
126 profile = profileResult;
127
128 // Update DOM
129 });
130});
131```
132
133### getUserInfo(accessToken, callback)
134
135Once the user has logged in and you are in possession of an access token, you can obtain the profile with `getUserInfo`.
136
137- **accessToken {String}**: User access token.
138- **callback {Function}**: Will be invoked after the user profile has been retrieved.
139
140#### Example
141
142```js
143lock.getUserInfo(accessToken, function (error, profile) {
144 if (!error) {
145 alert('hello ' + profile.name);
146 }
147});
148```
149
150### on(event, callback)
151
152Lock will emit events during its lifecycle.
153
154- `show`: emitted when Lock is shown. Has no arguments.
155- `hide`: emitted when Lock is hidden. Has no arguments.
156- `unrecoverable_error`: emitted when there is an unrecoverable error, for instance when no connection is available. Has the error as the only argument.
157- `authenticated`: emitted after a successful authentication. Has the authentication result as the only argument.
158- `authorization_error`: emitted when authorization fails. Has the error as the only argument.
159- `hash_parsed`: every time a new Auth0Lock object is initialized in redirect mode (the default), it will attempt to parse the hash part of the URL looking for the result of a login attempt. This is a _low-level_ event for advanced use cases and _authenticated_ and _authorization_error_ should be preferred when possible. After that, this event will be emitted with `null` if it couldn't find anything in the hash. It will be emitted with the same argument as the `authenticated` event after a successful login or with the same argument as `authorization_error` if something went wrong. This event won't be emitted in popup mode because there is no need to parse the URL's hash part.
160- `forgot_password ready`: emitted when the "Forgot password" screen is shown.
161- `forgot_password submit`: emitted when the user clicks on the submit button of the "Forgot password" screen.
162- `signin submit`: emitted when the user clicks on the submit button of the "Login" screen.
163- `signup submit`: emitted when the user clicks on the submit button of the "Sign up" screen.
164- `signup success`: emitted when the user successfully signs up.
165- `signup error`: emitted when signup fails. Has the error as an argument.
166- `federated login`: emitted when the user clicks on a social connection button. Has the connection name and the strategy as arguments.
167- `sso login`: emitted when the user clicks on an enterprise SSO connection button. Has the lock ID, connection object, and field name as arguments.
168- `ssodata fetched`: emitted when the SSOData endpoint was called, usually as a result of an internal `checkSession` call. Has the error and the SSOData object as arguments.
169
170### show(options)
171
172Displays the widget, allowing you to override some options.
173
174- **options {Object}**: Allows you to customize some aspect of the dialog's appearance and behavior. The options allowed in here are a subset of the options allowed in the constructor and will override them: `allowedConnections`, `auth.params`, `allowLogin`, `allowSignUp`, `allowForgotPassword`, `initialScreen`, `rememberLastLogin`, `flashMessage` and `languageDictionary`. See [below](#customization) for the details. Keep in mind that `auth.params` will be fully replaced and not merged.
175
176#### Example
177
178```js
179// without options
180lock.show();
181
182// will override the allowedConnections option passed to the constructor, if any
183lock.show({ allowedConnections: ['twitter', 'facebook'] });
184
185// will override the entire auth.params object passed to the constructor, if any
186lock.show({ auth: { params: { state: 'auth_state' } } });
187```
188
189### resumeAuth(hash, callback)
190
191If you set the [auth.autoParseHash](#authentication-options) option to `false`, you'll need to call this method to complete the authentication flow. This method is useful when you're using a client-side router that uses a `#` to handle URLs (angular2 with `useHash` or react-router with `hashHistory`).
192
193- **hash {String}**: The hash fragment received from the redirect.
194- **callback {Function}**: Will be invoked after the parse is done. Has an error (if any) as the first argument and the authentication result as the second one. If there is no hash available, both arguments will be `null`.
195
196#### Example
197
198```js
199lock.resumeAuth(hash, function (error, authResult) {
200 if (error) {
201 alert('Could not parse hash');
202 }
203 console.log(authResult.accessToken);
204});
205```
206
207### logout(options)
208
209Logs out the user.
210
211- **options {Object}**: This is optional and follows the same rules as [this](https://auth0.com/docs/libraries/auth0js#logout).
212
213#### Example
214
215```js
216lock.logout({ returnTo: 'https://myapp.com/bye-bye' });
217```
218
219### checkSession(params, callback)
220
221The checkSession method allows you to acquire a new token from Auth0 for a user who is already authenticated against the universal login page for your domain. The method accepts any valid OAuth2 parameters that would normally be sent to authorize. In order to use this method, you have to enable Web Origins for your application. For more information, see [Using checkSession to acquire new tokens](https://auth0.com/docs/libraries/auth0js#using-checksession-to-acquire-new-tokens).
222
223- **params {Object}**: OAuth2 params object to send to Auth0's servers.
224- **callback {Function}**: Will be invoked after the response from the server is returned. Has an error (if any) as the first argument and the authentication result as the second one.
225
226#### Example
227
228```js
229lock.checkSession({}, function (error, authResult) {
230 if (error || !authResult) {
231 lock.show();
232 } else {
233 // user has an active session, so we can use the accessToken directly.
234 lock.getUserInfo(authResult.accessToken, function (error, profile) {
235 console.log(error, profile);
236 });
237 }
238});
239```
240
241### Customization
242
243The appearance of the widget and the mechanics of authentication can be customized with an `options` object which has one or more of the following properties. Each method that opens the dialog can take an `options` object as its first argument.
244
245#### UI options
246
247- **allowedConnections {Array}**: List of connection that will be available to perform the authentication. It defaults to all enabled connections.
248- **autoclose {Boolean}**: Determines whether or not the Lock will be closed automatically after a successful sign in. If the Lock is not `closable` it won't be closed even if this option is set to `true`. Defaults to `false`.
249- **autofocus {Boolean}**: Determines whether or not the first input on the screen, that is the email or phone number input, should have focus when the Lock is displayed. Defaults to `false` when a `container` option is provided or the Lock is being rendered on a mobile device. Otherwise, it defaults to `true`.
250- **avatar {Object}**: Determines whether or not an avatar and a username should be displayed on the Lock's header once an email or username has been entered and how to obtain it. By default avatars are fetched from [Gravatar](https://gravatar.com/). Supplying `null` will disable the functionality. To fetch avatar from other provider see [below](#avatar-provider).
251- **container {String}**: The `id` of the HTML element where the Lock will be rendered. This makes the Lock appear inline instead of in a modal window.
252- **language {String}**: Specifies the language of the widget. Defaults to `"en"`. Supported languages are:
253 - `de`: German
254 - `en`: English
255 - `es`: Spanish
256 - `it`: Italian
257 - `nb`: Norwegian bokmål
258 - `pt-BR`: Brazilian Portuguese
259 - `ru`: Russian
260 - `zh`: Chinese
261 - `ja`: Japanese
262 - [Check all the available languages](https://github.com/auth0/lock/tree/master/src/i18n)
263- **languageDictionary {Object}**: Allows you to customize every piece of text displayed in the Lock. Defaults to `{}`. See below [Language Dictionary Specification](#language-dictionary-specification) for the details.
264- **closable {Boolean}**: Determines whether or not the Lock can be closed. When a `container` option is provided its value is always `false`, otherwise it defaults to `true`.
265- **popupOptions {Object}**: Allows you to customize the location of the popup in the screen. Any [position and size feature](https://developer.mozilla.org/en-US/docs/Web/API/Window/open#Position_and_size_features) allowed by `window.open` is accepted. Defaults to `{}`.
266- **rememberLastLogin {Boolean}**: Determines whether or not to show a screen that allows you to quickly log in with the account you used the last time when the `initialScreen` option is set to `"login"` (the default). Defaults to `true`.
267- **flashMessage {Object}**: Shows an `error` or `success` flash message when Lock is shown.
268 - **type {String}**: The message type, it should be `error` or `success`.
269 - **text {String}**: The text to show.
270- **allowAutocomplete {Boolean}**: Determines whether or not the email or username inputs will allow autocomplete (`<input autocomplete />`). Defaults to `false`.
271- **scrollGlobalMessagesIntoView {Boolean}**: Determines whether or not a globalMessage should be scrolled into the user's viewport. Defaults to `true`.
272- **allowShowPassword {Boolean}**: Determines whether or not add a checkbox to show the password when typing it. Defaults to `false`.
273- **allowPasswordAutocomplete {Boolean}**: Determines whether the password field will allow autocomplete; setting this to `true` is required for password manager support and to avoid many cases of adverse behavior. Defaults to `false`.
274- **preferConnectionDisplayName {Boolean}**: If true, Lock will try to use the connection display name as configured in the manage dashboard, if available.
275
276#### Theming options
277
278Theme options are grouped in the `theme` property of the `options` object.
279
280```js
281var options = {
282 theme: {
283 labeledSubmitButton: false,
284 logo: 'https://example.com/assets/logo.png',
285 primaryColor: 'green',
286 authButtons: {
287 connectionName: {
288 displayName: '...',
289 primaryColor: '...',
290 foregroundColor: '...',
291 icon: 'https://.../logo.png'
292 }
293 }
294 }
295};
296```
297
298- **labeledSubmitButton {Boolean}**: Indicates whether or not the submit button should have a label. Defaults to `true`. When set to `false` an icon will be shown. The labels can be customized through the `languageDictionary`.
299- **logo {String}**: Url for an image that will be placed in the Lock's header. Defaults to Auth0's logo.
300- **primaryColor {String}**: Defines the primary color of the Lock, all colors used in the widget will be calculated from it. This option is useful when providing a custom `logo` to ensure all colors go well together with the logo's color palette. Defaults to `"#ea5323"`.
301- **authButtons {Object}**: Allows the customization of the custom oauth2 login buttons.
302 - **displayName {String}**: The name to show instead of the connection name.
303 - **primaryColor {String}**: The button's background color. Defaults to `"#eb5424"`.
304 - **foregroundColor {String}**: The button's text color. Defaults to `"#FFFFFF"`.
305 - **icon {String}**: The icon's url for the connection. For example:`"https://site.com/logo.png"`.
306
307#### Authentication options
308
309Authentication options are grouped in the `auth` property of the `options` object. The default scope used by Lock is `openid profile email`.
310
311```js
312var options = {
313 auth: {
314 params: {
315 param1: 'value1',
316 scope: 'openid profile email'
317 },
318 autoParseHash: true,
319 redirect: true,
320 redirectUrl: 'some url',
321 responseMode: 'form_post',
322 responseType: 'token',
323 sso: true,
324 connectionScopes: {
325 connectionName: ['scope1', 'scope2']
326 }
327 }
328};
329```
330
331- **params {Object}**: Specifies extra parameters that will be sent when starting a login. Defaults to `{}`.
332- **autoParseHash {Boolean}**: When set to `true`, Lock will parse the `window.location.hash` string when instantiated. If set to `false`, you'll have to manually resume authentication using the [resumeAuth](#resumeauthhash-callback) method.
333- **redirect {Boolean}**: When set to `true`, the default, _redirect mode_ will be used. Otherwise, _popup mode_ is chosen. See [below](#popup-mode) for more details.
334- **redirectUrl {String}**: The URL Auth0 will redirect back to after authentication. Defaults to the empty string `""` (no redirect URL).
335- **responseMode {String}**: Should be set to `"form_post"` if you want the code or the token to be transmitted via an HTTP POST request to the `redirectUrl` instead of being included in its query or fragment parts. Otherwise, it should be omitted.
336- **responseType {String}**: Should be set to `"token"` for Single Page Applications, and `"code"` otherwise. Also, `"id_token"` is supported for the first case. Defaults to `"code"` when `redirectUrl` is provided, and to `"token"` otherwise.
337- **sso {Boolean}**: Determines whether Single Sign-On is enabled or not in **Lock**. The Auth0 SSO session will be created regardless of this option if SSO is enabled for your application or tenant.
338- **connectionScopes {Object}**: Allows you to set scopes to be sent to the oauth2/social/enterprise connection for authentication.
339
340#### Database options
341
342- **additionalSignUpFields {Array}**: Allows you to provide extra input fields during sign up. See [below](#additional-sign-up-fields) more for details. Defaults to `[]`.
343- **allowLogin {Boolean}**: When set to `false` the widget won't display the _login screen_. This is useful if you want to use the widget just for signups (the _login and sign up tabs_ in the _sign up screen_ will be hidden) or to reset passwords (the _back button_ in the _forgot password screen_ will be hidden). In such cases you may also need to specify the `initialScreen`, `allowForgotPassword` and `allowSignUp` options. It defaults to `true`.
344- **allowForgotPassword {Boolean}**: When set to `false` hides the _"Don't remember your password?"_ link in the _login screen_, making the _forgot password screen_ unreachable. Defaults to `true`. Keep in mind that if you are using a database connection with a _custom database_ which doesn't have a _change password script_ the forgot password screen won't be available.
345- **allowSignUp {Boolean}**: When set to `false` hides the _login and sign up tabs_ in the _login screen_, making the _sign up screen_ unreachable. Defaults to `true`. Keep in mind that if the database connection has sign ups _disabled_ or you are using a _custom database_ which doesn't have a _create script_, then the sign up screen won't be available.
346- **defaultDatabaseConnection {String}**: Specifies the database connection that will be used when there is more than one available.
347- **initialScreen {String}**: Name of the screen that will be shown when the widget is opened. Valid values are `"login"`, `"signUp"`, and `"forgotPassword"`. If this option is left unspecified, the widget will pick the first screen that is available from the previous list. If you set `initialScreen` to `"forgotPassword"` we recommend that you set `allowLogin` to `"false"`, otherwise a back button will be shown in the forgot password screen and it might not be clear to the user where that back button will take them.
348- **loginAfterSignUp {Boolean}**: Determines whether or not the user will be automatically signed in after a successful sign up. Defaults to `true`.
349- **forgotPasswordLink {String}**: URL for a page that allows the user to reset her password. When set to a non-empty string, the user will be linked to the provided URL when clicking the _"Don't remember your password?"_ link in the _login screen_.
350- **showTerms {Boolean}**: When set to `true` displays the `languageDictionary.signUpTerms` string. Defaults to `true`.
351- **mustAcceptTerms {Boolean}**: When set to `true` displays a checkbox input along with the terms and conditions that must be checked before signing up. The terms and conditions can be specified via the `languageDictionary` option, see the example below. Defaults to `false`.
352- **prefill {Object}**: Allows you to set the initial value for the _email_ and/or _username_ inputs, e.g. `{prefill: {email: "someone@auth0.com", username: "someone"}}`. When omitted no initial value will be provided.
353- **signUpLink {String}**: URL for a page that allows the user to sign up. When set to a non-empty string, the user will be linked to the provided URL when clicking the _sign up_ tab in the _login screen_.
354- **usernameStyle {String}**: Determines what will be used to identify the user for a Database connection that has the `requires_username` flag set, otherwise it will be ignored. Possible values are `"username"` and `"email"` and by default both `username` and `email` are allowed.
355- **signUpHideUsernameField {Boolean}**: When set to `true` hides the _username_ input during sign up for a Database connection that has the `requires_username` flag set. Defaults to `false`.
356- **signUpFieldsStrictValidation {Boolean}**: When set to `true`, the _email_ input on the sign-up page is validated using [`validator`](https://www.npmjs.com/package/validator). Otherwise, a very loose check is made on the format before being fully validate on the server. Defaults to `false`.
357
358#### Enterprise options
359
360- **defaultEnterpriseConnection {String}**: Specifies the enterprise connection which allows you to log in using a username and a password that will be used when there is more than one available or there is a database connection. If a `defaultDatabaseConnection` is provided the database connection will be used and this option will be ignored.
361
362#### Example
363
364```js
365var options = {
366 container: 'myContainer',
367 closable: false,
368 languageDictionary: {
369 signUpTerms:
370 "I agree to the <a href='/terms' target='_new'>terms of service</a> and <a href='/privacy' target='_new'>privacy policy</a>.",
371 title: 'My Company'
372 },
373 autofocus: false
374};
375```
376
377#### Passwordless options
378
379- **passwordlessMethod {String}**: When using `Auth0LockPasswordless` with an email connection, you can use this option to pick between sending a [code](https://auth0.com/docs/connections/passwordless/spa-email-code) or a [magic link](https://auth0.com/docs/connections/passwordless/spa-email-link) to authenticate the user. Available values for email connections are `code` and `link`. Defaults to `code`. SMS passwordless connections will always use `code`.
380- **useCustomPasswordlessConnection {Boolean}**: Enables the use of a custom passwordless connection (see below).
381
382#### Additional passwordless connections
383
384By default, only two passwordless connections are available: `email` and `sms`. However, it is possible to create additional passwordless connections that employ the `email` or `sms` strategy through the Management API. To use these connections in Lock, you must:
385
3861. Specify the custom connection in the `allowedConnections` option, and
3872. Enable the `useCustomPasswordlessConnection` flag in the options
388
389Users logging in using this connection should then be associated with the correct passwordless connection and this can be verified in [the logs](https://manage.auth0.com/#/logs).
390
391**Note:** If you specify more than one connection in `allowedConnections`, the first one will always be used.
392
393#### Hooks
394
395Lock supports hooks that can be used to integrate into various procedures within Lock.
396
397| Name | Description |
398| ----------- | -------------------------------------------------------------------------------------------------------------------------------------- |
399| `loggingIn` | Called when the user presses the login button; after validating the login form, but before calling the login endpoint |
400| `signingUp` | Called when the user presses the button on the sign-up page; after validating the signup form, but before calling the sign up endpoint |
401
402**API**
403Both hooks accept two arguments:
404
405| Name | Description |
406| --------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
407| `context` | this argument is currently always `null` but serves as a future-proofing mechanism to support providing additional data without us requiring breaking changes to the library |
408| `cb` | a callback function to call when the hook is finished. Execution of the user journey is blocked until this function is called by the hook |
409
410**API**
411
412Specify your hooks using a new `hooks` configuration item when setting up the library:
413
414```js
415new Auth0Lock('client ID', 'domain', {
416 hooks: {
417 loggingIn: function(context, cb) {
418 console.log('Hello from the login hook!');
419 cb();
420 },
421 signingUp: function(context, cb) {
422 console.log('Hello from the sign-up hook!');
423 cb();
424 }
425});
426```
427
428**Error handling**
429
430The developer can throw an error to block the login or sign-up process. The developer can either specify a specific object and show the error on the page, or throw a generic error which causes Lock to show a fallback error:
431
432```js
433new Auth0Lock('client ID', 'domain', {
434 hooks: {
435 loggingIn: function(context, cb) {
436 // Throw an object with code: `hook_error` to display this on the Login screen
437 throw { code: 'hook_error', description: 'There was an error in the login hook!' };
438
439 // Throw something generic to show a fallback error message
440 throw "Some error happened";
441 },
442});
443```
444
445**Note:** The error's `description` field is not sanitized by the SDK and so any content that reflects user input or could otherwise display dangerous HTML should be sanitized by your hook.
446
447#### Other options
448
449- **configurationBaseUrl {String}**: Overrides application settings base URL. By default it uses Auth0's CDN URL when the `domain` has the format `*.auth0.com`. Otherwise, it uses the provided `domain`.
450- **languageBaseUrl {String}**: Overrides the language source URL for Auth0's provided translations. By default it uses to Auth0's CDN URL `https://cdn.auth0.com`.
451- **hashCleanup {Boolean}**: When enabled, it will remove the hash part of the callback URL after the user authentication. Defaults to `true`.
452- **connectionResolver {Function}**: When in use, provides an extensibility point to make it possible to choose which connection to use based on the username information. Has `username`, `context`, and `callback` as parameters. The callback expects an object like: `{type: 'database', name: 'connection name'}`. **This only works for database connections.** Keep in mind that this resolver will run in the form's `onSubmit` event, so keep it simple and fast. **This is a beta feature. If you find a bug, please open a GitHub [issue](https://github.com/auth0/lock/issues/new).**
453
454```js
455var options = {
456 connectionResolver: function (username, context, cb) {
457 var domain = username.includes('@') && username.split('@')[1];
458 if (domain) {
459 // If the username is test@auth0.com, the connection used will be the `auth0.com` connection.
460 // Make sure you have a database connection with the name `auth0.com`.
461 cb({ type: 'database', name: domain });
462 } else {
463 // Use the default approach to figure it out the connection
464 cb(null);
465 }
466 }
467};
468```
469
470#### Language Dictionary Specification
471
472A language dictionary is an object that allows you to customize every piece of text the Lock needs to display. For instance, the following code will change the title displayed in the header and the placeholder for the email field.
473
474```js
475var options = {
476 languageDictionary: {
477 emailInputPlaceholder: 'Please enter your email',
478 title: 'My Company'
479 }
480};
481```
482
483#### Additional sign up fields
484
485Extra input fields can be added to the sign up screen with the `additionalSignUpFields` option. Every input must have a `name` and a `placeholder`, and an `icon` URL can also be provided. Also, the initial value can be provided with the `prefill` option, which can be a **string** with the value or a **function** that obtains it. Other options depend on the type of the field, which is defined via the `type` option and defaults to `"text"`.
486
487Additional sign up fields are rendered below the default fields in the order they are provided.
488
489##### Text field
490
491A `validator` function can also be provided.
492
493```js
494var options = {
495 additionalSignUpFields: [
496 {
497 name: 'address',
498 placeholder: 'enter your address',
499 // The following properties are optional
500 ariaLabel: 'Address',
501 icon: 'https://example.com/assets/address_icon.png',
502 prefill: 'street 123',
503 validator: function (address) {
504 return {
505 valid: address.length >= 10,
506 hint: 'Must have 10 or more chars' // optional
507 };
508 }
509 }
510 ]
511};
512```
513
514If you don't provide a `validator` function a default validator is applied, which requires the text field to contain some value (be non-empty). You can make a field optional by using a validator that always return `true`:
515
516```js
517var options = {
518 additionalSignUpFields: [
519 {
520 name: 'address',
521 placeholder: 'enter your address (optional)',
522 validator: function () {
523 return true;
524 }
525 }
526 ]
527};
528```
529
530If you want to save the value of the attribute in the root of your profile, use `storage: 'root'`. Only a subset of values can be stored this way. The list of attributes that can be added to your root profile is [here](https://auth0.com/docs/api/management/v2#!/Users/patch_users_by_id). By default, every additional sign up field is stored inside the `user_metadata` object.
531
532```js
533var options = {
534 additionalSignUpFields: [
535 {
536 name: 'name',
537 storage: 'root'
538 }
539 ]
540};
541```
542
543##### Select field
544
545To specify a select field `type: "select"` needs to be provided along with the `options` property.
546
547```js
548var options = {
549 additionalSignUpFields: [
550 {
551 type: 'select',
552 name: 'location',
553 placeholder: 'choose your location',
554 options: [
555 { value: 'us', label: 'United States' },
556 { value: 'fr', label: 'France' },
557 { value: 'ar', label: 'Argentina' }
558 ],
559 // The following properties are optional
560 ariaLabel: 'Location',
561 icon: 'https://example.com/assets/location_icon.png',
562 prefill: 'us'
563 }
564 ]
565};
566```
567
568The `options` and the `prefill` value can be provided through a function.
569
570```js
571var options = {
572 additionalSignUpFields: [
573 {
574 type: 'select',
575 name: 'location',
576 placeholder: 'choose your location',
577 options: function (cb) {
578 // obtain options, in case of error you call cb with the error in the
579 // first arg instead of null
580 cb(null, options);
581 },
582 ariaLabel: 'Location',
583 icon: 'https://example.com/assets/location_icon.png',
584 prefill: function (cb) {
585 // obtain prefill, in case of error you call cb with the error in the
586 // first arg instead of null
587 cb(null, prefill);
588 }
589 }
590 ]
591};
592```
593
594##### Checkbox field
595
596To specify a checkbox field use: `type: "checkbox"`
597The `prefill` value can determine the default state of the checkbox and it is required.
598
599```js
600var options = {
601 additionalSignUpFields: [
602 {
603 type: 'checkbox',
604 name: 'newsletter',
605 prefill: 'true',
606 placeholder: 'I hereby agree that I want to receive marketing emails from your company',
607 // placeholderHTML - is an optional field and overrides the value of placeholder
608 // do not use user inputted data for HTML fields as they are vulnerable to XSS
609 placeholderHTML:
610 '<b>I hereby agree that I want to receive marketing emails from your company</b>',
611 // ariaLabel - is an optional field
612 ariaLabel: 'Activate Newsletter'
613 }
614 ]
615};
616```
617
618##### Hidden field
619
620To specify a hidden field use: `type: "hidden"`. Both the `value` and `name` properties are required.
621
622```js
623var options = {
624 additionalSignUpFields: [
625 {
626 type: 'hidden',
627 name: 'signup_code',
628 value: 'foobar123'
629 }
630 ]
631};
632```
633
634#### Avatar provider
635
636Lock can show avatars fetched from anywhere. A custom avatar provider can be specified with the `avatar` option by passing an object with the keys `url` and `displayName`. Both properties are functions that take an email and a callback function.
637
638```js
639var options = {
640 avatar: {
641 url: function (email, cb) {
642 // obtain URL for email, in case of error you call cb with the error in
643 // the first arg instead of null
644 cb(null, url);
645 },
646 displayName: function (email, cb) {
647 // obtain displayName for email, in case of error you call cb with the
648 // error in the first arg instead of null
649 cb(null, displayName);
650 }
651 }
652};
653```
654
655### Popup mode
656
657A popup window can be displayed instead of redirecting the user to a social provider website. While this has the advantage of preserving page state, it has some issues. Often times users have popup blockers that prevent the login page from even displaying. There are also known issues with mobile browsers. For example, in recent versions of Chrome on iOS, the login popup does not [close properly](https://github.com/auth0/lock/issues/71) after login. For these reasons, we encourage developers to avoid this mode, even with Single Page Apps.
658
659If you decide to use popup mode you can activate it by passing the option `auth: {redirect: false}` when constructing `Auth0Lock`.
660
661```js
662var clientId = 'YOUR_AUTH0_APP_CLIENTID';
663var domain = 'YOUR_DOMAIN_AT.auth0.com';
664var options = {
665 auth: {
666 redirect: false
667 }
668};
669
670var lock = new Auth0Lock(clientId, domain, options);
671lock.show();
672```
673
674More information can be found in [Auth0's documentation](https://auth0.com/docs/libraries/lock/v11/authentication-modes#popup-mode).
675
676## Browser Compatibility
677
678We ensure browser compatibility in Chrome, Safari, Firefox and IE >= 10. We currently use [zuul](https://github.com/defunctzombie/zuul) along with [Saucelabs](https://saucelabs.com) to run integration tests on each push.
679
680## Issue Reporting
681
682If you have found a bug or if you have a feature request, please report them at this repository issues section. Please do not report security vulnerabilities on the public GitHub issue tracker. The [Responsible Disclosure Program](https://auth0.com/whitehat) details the procedure for disclosing security issues.
683
684## Author
685
686[Auth0](https://auth0.com)
687
688## License
689
690This project is licensed under the MIT license. See the [LICENSE](LICENSE) file for more info.
691
692[circleci-image]: https://img.shields.io/circleci/project/github/auth0/lock.svg?style=flat-square
693[circleci-url]: https://circleci.com/gh/auth0/lock/tree/master
694[npm-image]: https://img.shields.io/npm/v/auth0-lock.svg?style=flat-square
695[npm-url]: https://npmjs.org/package/auth0-lock
696[license-image]: https://img.shields.io/npm/l/auth0-lock.svg?style=flat-square
697[license-url]: #license
698[downloads-image]: https://img.shields.io/npm/dm/auth0-lock.svg?style=flat-square
699[downloads-url]: https://npmjs.org/package/auth0-lock
700[david-image]: https://david-dm.org/auth0/lock/status.svg?style=flat-square
701[david-url]: https://david-dm.org/auth0/lock
702
703[![FOSSA Status](https://app.fossa.com/api/projects/git%2Bgithub.com%2Fauth0%2Flock.svg?type=large)](https://app.fossa.com/projects/git%2Bgithub.com%2Fauth0%2Flock?ref=badge_large)