0.0.15 • Published 5 years ago

userin-form-gray-quail v0.0.15

Weekly downloads
3
License
BSD-3-Clause
Repository
github
Last release
5 years ago

UserIn Form - Gray Quail · NPM License Neap

UserIn Form - Gray Quail is a configurable JS form widget that uses the UserIn middleware to login to Apps using the following popular Identity Providers:

  • Facebook
  • Google
  • LinkedIn
  • GitHub
  • Twitter

This project uses vanilla JS and CSS. There are no dependencies, except for development. More about modifying this project to your own needs under the Customizing This Project To Your Own Needs section.

Table of Contents

Install

Add the CSS and the JS into your web page as follow:

<!DOCTYPE html>
<html>
<head>
	<!-- Some HTML here... -->
	<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/userin-form-gray-quail/dist/style.min.css">
</head>
<body>
	<div id="userin-form-modal"></div>
	<!-- Some HTML here... -->
	<script src="https://cdn.jsdelivr.net/npm/userin-form-gray-quail"></script>
	<script type="text/javascript">
		var loginForm = new UserInForm({
			el: '#userin-form-modal',
			usernamePassword: 'https://your-hosted-userin-domain/default/oauth2'
		})
	</script>
</body>
</html>

This example demonstrates the minimal configuration.

ParameterFieldTypeDescription
elOPTIONALStringCSS selector to the DOM under which the form is inserted. If not defined, the form is attached under the body
usernamePasswordREQUIREDStringURL of your UserIn auth endpoint (e.g., http://localhost:3000/default/oauth2)

Configuration

Standard Config

The configuration above showcases the minimal settings. The following example demonstrates a configuration that is a bit more common:

var loginForm = new UserInForm({
	el: 'some-css-dom-selector',
	logo: "https://neap.co/img/neap_color_horizontal.png",
	tagline: "Killer App",
	blurb: "The adventure begins now",
	usernamePassword: 'http://localhost:3000/default/oauth2',
	facebook: 'http://localhost:3000/facebook/oauth2',
	google: 'http://localhost:3000/google/oauth2',
	terms: 'https://termsfeed.com/blog/saas-terms-use-privacy-policy/', 
	privacyPolicy: 'https://privacypolicies.com/blog/privacy-policy-saas/', 
	forgotPassword: 'https://neap.co', 
	redirectUrls: {
		onSuccess: 'http://localhost:8080/success',
		onError: 'http://localhost:8080/dev'
	}
})

Parameters

ParameterFieldTypeDescription
elOPTIONALStringCSS selector to the DOM under which the form is inserted. If not defined, the form is attached under the body
logoOPTIONALStringURL of the logo that appears at the top of the form.
taglineOPTIONALStringTagline that appears at the top of the form.
blurbOPTIONALStringBlurb that appears at the top of the form.
usernamePasswordREQUIREDStringURL of your UserIn auth endpoint (e.g., http://localhost:3000/default/oauth2)
facebookOPTIONALStringURL of your UserIn OAuth endpoint for Facebook (e.g., http://localhost:3000/facebook/oauth2)
googleOPTIONALStringURL of your UserIn OAuth endpoint for Google (e.g., http://localhost:3000/google/oauth2)
termsOPTIONALStringURL to your terms and conditions web page.
privacyPolicyOPTIONALStringURL to your privacy policy web page.
forgotPasswordOPTIONALStringURL to your forgot password web page.
redirectUrlsOPTIONALObjectURLs used after successful or failed authentication.

RECOMMENDATION: Use the URL where this form is hosted for the redirectUrls.onError. UserIn passes error messages in the query string and this form has been created to handled this format. When an error occurs, the details will be displayed in this form.

NOTE: The order in which the Identity Providers appear in the form can be modified by changing the order of their definitions. In the example above, putting Google before Facebook cna be done as follow:

```js
{
	google: 'http://localhost:3000/google/oauth2',
	facebook: 'http://localhost:3000/facebook/oauth2',
}
```

Switching To Modal Mode

This example is very similar to the one above, but instead of using a static form, this configuration uses a modal:

<!DOCTYPE html>
<html>
<head>
	<title>UserIn - Gray Quail</title>
	<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/userin-form-gray-quail/dist/style.min.css">
</head>
<body>
	<button id="login">Login</button>
	<div id="main"></div>
	<script src="https://cdn.jsdelivr.net/npm/userin-form-gray-quail"></script>
	<script type="text/javascript">
		var loginForm = new UserInForm({
			el: '#main',
			logo: "https://neap.co/img/neap_color_horizontal.png",
			tagline: "Killer App",
			blurb: "The adventure begins now",
			usernamePassword: 'http://localhost:3000/default/oauth2',
			facebook: 'http://localhost:3000/facebook/oauth2',
			google: 'http://localhost:3000/google/oauth2',
			terms: 'https://termsfeed.com/blog/saas-terms-use-privacy-policy/', 
			privacyPolicy: 'https://privacypolicies.com/blog/privacy-policy-saas/', 
			forgotPassword: 'https://neap.co', 
			redirectUrls: {
				onSuccess: 'http://localhost:8080/success',
				onError: 'http://localhost:8080/dev'
			},
			modal: {
				animate: true
			},
			init: {
				visible: false
			}
		})
		document.getElementById('login').addEventListener('click', function() {
			loginForm.show()
			return false
		})
	</script>
</body>
</html>

Parameters

ParameterFieldTypeDescription
modalOPTIONALBoolean or ObjectTo toggle the modal mode, set this property to either true or a truthy object.
modal.animateOPTIONALBooleanDefault is false. When false, the modal appears immediately when it is opened. It also disappears immediately when it is closed. When set to true, opening and closing the form respectively fades in and out.
initOPTIONALObjectThis object determines the form's behavior after it has loaded.
init.visibleOPTIONALBooleanDefault is true. When true, the form appears automatically after it is loaded. When set to false, the form when it has loaded. It must be opened explicitely using the show() api as demonstrated at the bottom of the example above.

Other Configs

Changing The Default Form From Sign Up To Log In

Use the init property as follow:

init: {
	mode: 'login'
}

Configuring Tagline & Blurb For The Login and Sign Up Forms

Instead of using the tagline and blurb as previously:

tagline: "Killer App",
blurb: "The adventure begins now"

Use:

tagline: {
	signup: "Killer App",
	login: "Welcome Back"
},
blurb: {
	signup: "The adventure begins now",
	login: "Let's continue"
}

Full Parameters List

ParameterFieldTypeDescription
elOPTIONALStringCSS selector to the DOM under which the form is inserted. If not defined, the form is attached under the body
usernamePasswordREQUIREDStringURL of your UserIn auth endpoint (e.g., http://localhost:3000/default/oauth2)
logoOPTIONALStringURL of the logo that appears at the top of the form.
taglineOPTIONALStringTagline that appears at the top of the form.
blurbOPTIONALStringBlurb that appears at the top of the form.
facebookOPTIONALStringURL of your UserIn OAuth endpoint for Facebook (e.g., http://localhost:3000/facebook/oauth2)
googleOPTIONALStringURL of your UserIn OAuth endpoint for Google (e.g., http://localhost:3000/google/oauth2)
termsOPTIONALStringURL to your terms and conditions web page.
privacyPolicyOPTIONALStringURL to your privacy policy web page.
forgotPasswordOPTIONALStringURL to your forgot password web page.
redirectUrlsOPTIONALObjectURLs used after successfull or failed authentication.
redirectUrls.successOPTIONALStringObjectURL used after successfull authentication. If it is an object, then it must define 2 properties: login and signup.
redirectUrls.success.loginREQUIREDStringURL used after successfull authentication on the login form.
redirectUrls.success.signupREQUIREDStringURL used after successfull authentication on the signup form.
redirectUrls.errorOPTIONALStringObjectURL used after failed authentication. If it is an object, then it must define 2 properties: login and signup.
redirectUrls.error.loginREQUIREDStringURL used after failed authentication on the login form.
redirectUrls.error.signupREQUIREDStringURL used after failed authentication on the signup form.
modalOPTIONALBoolean or ObjectTo toggle the modal mode, set this property to either true or a truthy object.
modal.animateOPTIONALBooleanDefault is false. When false, the modal appears immediately when it is opened. It also disappears immediately when it is closed. When set to true, opening and closing the form respectively fades in and out.
initOPTIONALObjectThis object determines the form's behavior after it has loaded.
init.modeOPTIONALStringDefault is 'signup'. With 'signup', the default form shown to the user when the widget appears is the signup form. When set to 'login', the first form shown to the user when the widget appears is the login form.
init.visibleOPTIONALBooleanDefault is true. This configuration is only when the modal property is truthy. When true, the form appears automatically after it is loaded. When set to false, the form when it has loaded. It must be opened explicitely using the show() api as demonstrated at the bottom of the example above.

How To

How To Control The Form With Query Parameters?

This UserIn Form supports configuration through URL query parameters. For example:

http://localhost:8080/dev?screen=login&redirect_url=https%3A%2F%2Fexample.com

This URI opens the form login form instead of the default signup. Upon successfull login, the redirect url is overidden by https://example.com.

It is also possible to pre-fill the form as explained in the next section.

The full supported list of params is:

ParameterDescription
screenDetermines which form needs to be displayed. Possible values are: login, signup
redirect_urlDetermines where to redirect upon successfull authentication.
firstNamePre-fills the signup's first name field
lastNamePre-fills the signup's last name field
emailPre-fills both the signup and login email field

How To Pre-Fill Form?

Pre-filling the UserIn Form is possible using query parameters. The following example shows an exhaustive case of all the parameters that can be used:

http://localhost:8080/dev?screen=login&firstName=Nic&lastName=Dao&email=nic%40neap.co

Where:

ParameterDescription
screenDetermines which form needs to be displayed. Possible values are: login, signup
firstNamePre-fills the signup's first name field
lastNamePre-fills the signup's last name field
emailPre-fills both the signup and login email field

This feature is what allows the next trick: How To Keep The Form Filled With The User Info After A Failed Login or Signup?.

How To Keep The Form Filled With The User Info After A Failed Login or Signup?

When the uses wrongly enter their password or username, they may be redirected back to the UserIn Form if you've setup the redirectUrls property to do so. By default, the form restarts and all the previously filled up inputs are empty. If you want to preserve the previous inputs to avoid your users to be forced to re-enter their details again, you can configure your UserIn microservice to return your users' details in the query paramaters. As explained above, this pre-fills the form.

List Of Supported Identity Providers

This UserIn form widjet supports 5 different Identity Providers (IdPs) and the standard username/password form. To use any of those IdPs, your UserIn instance must have been configured to support them. To set up an IdP in UserIn, please refer to the documentation here.

Once configured in UserIn, each IdP should have an entry point similar to https://your-hosted-userin-domain/<idp-name>/oauth2. Configuring this form with an IdP can then be achieved by modifying this UserInForm input as follow:

new UserInForm({
	// other configs...
	usernamePassword: 'https://your-hosted-userin-domain/default/oauth2',
	facebook: 'https://your-hosted-userin-domain/facebook/oauth2',
	google: 'https://your-hosted-userin-domain/google/oauth2',
	linkedin: 'https://your-hosted-userin-domain/linkedin/oauth2',
	github: 'https://your-hosted-userin-domain/github/oauth2',
	twitter: 'https://your-hosted-userin-domain/twitter/oauth2'
})

This config will enable all available IdPs in that order:

  • Facebook
  • Google
  • LinkedIn
  • GitHub
  • Twitter

To change the order to, for example:

  • Twitter
  • GitHub
  • LinkedIn
  • Google
  • Facebook

Simply change the input order as follow:

new UserInForm({
	// other configs...
	usernamePassword: 'https://your-hosted-userin-domain/default/oauth2',
	twitter: 'https://your-hosted-userin-domain/twitter/oauth2',
	github: 'https://your-hosted-userin-domain/github/oauth2',
	linkedin: 'https://your-hosted-userin-domain/linkedin/oauth2',
	google: 'https://your-hosted-userin-domain/google/oauth2',
	facebook: 'https://your-hosted-userin-domain/facebook/oauth2'
})

Customizing This Project To Your Own Needs

This project aims to be modified by you so you can customize it beyond the out-of-the-box configurations we offer. There are 2 ways you can customize this project:

  1. Option 1 - Replace The CSS With Your Own (easiest): With this option, the form's functionalities fit all you needs, but the style does not. To solve this challenge, simply copy this form's CSS, and update it based on your specific needs.
  2. Option 2 - Clone This Project And Build Your Own Form: With this option, the functionalities of this form do not meet your requirements fully. Instead of recoding everything from scratch, you prefer to leverage our work and modify our code.

Option 1 - Replace The CSS With Your Own

The original CSS and its minified version are respectively hosted at:

Copy the unminified version, modify it, and use your version instead of ours.

Option 2 - Clone This Project And Build Your Own Form

Follow the next steps to build your own form using this project:

1. Clone/Fork This Project

Fork this repo, or clone it using:

git clone https://github.com/nicolasdao/userin-form-gray-quail.git

2. Install The Dev Dependencies & Run The Project

npm i

The only dependencies of this project are dev dependencies which can be described in a nutshell as:

  • babel + webpack + uglifyjs: Used to compiled the source code written with ES6 to ES5.
  • uglifycss: Used to compress the CSS.
  • eslint: Used to lint the code.
  • standard-version: Used to facilitate the version bumping and the CHANGELOG maintenance.
  • express: Used to host a test server.

The source code itself does not use any dependencies. It is pure vanilla JS and vanilla CSS.

After installing all the dependencies, run the server:

npm start

This will host a demo page with a login button at http://localhost:8080/dev/.

INFO: The HTML page hosted at the above URL is the index-dev.html. Use this page during your test. The index-prod.html is discussed later in step 4. Rebuild For Production Use.

3. Modify The Source Code To Fit Your Requirements

The source code is located under the src folder. There are only 2 files:

  • index.js: Contains the vanilla ES6 JS responsible to configure the widget.
  • style.css: Contains the vanilla CSS responsible to styling the widget.

4. Rebuild For Production Use

Once you're done with all your code changes and you feel ready to deploy your code in production, follow the next steps:

  1. Lint the code to minimize the risk of silly mistakes: npm run lint.
  2. Change the project name in the package.json to userin-form-<your code name>. This is important if you're interested in having your form listed as an official UserIn form. If you're not interested, rename that package using whatever name you want.
  3. Compile the code to support ES5 and minimize both the JS and CSS: npm run build.
  4. Test your rebuilt widget using the prod endpoint:
    1. npm start
    2. Browse to http://localhost:8080/prod/. This endpoint serves the index-prod.html page which is configured to serve the content compiled inside the dist folder.

Deploy Your New Widget To NPM & JsDeliver CDN

Deploy your new UserIn form to NPM: npm publish

This command will automatically host your new widget for free using the https://www.jsdelivr.com/ CDN. Your code will be available at:

Contribute

Though this project is designed to be forked and modified to your own custom needs, we also accepts pull requests.

This Is What We re Up To

We are Neap, an Australian Technology consultancy powering the startup ecosystem in Sydney. We simply love building Tech and also meeting new people, so don't hesitate to connect with us at https://neap.co.

Our other open-sourced projects:

GraphQL

  • graphql-s2s: Add GraphQL Schema support for type inheritance, generic typing, metadata decoration. Transpile the enriched GraphQL string schema into the standard string schema understood by graphql.js and the Apollo server client.
  • schemaglue: Naturally breaks down your monolithic graphql schema into bits and pieces and then glue them back together.
  • graphql-authorize: Authorization middleware for graphql-serverless. Add inline authorization straight into your GraphQl schema to restrict access to certain fields based on your user's rights.

React & React Native

Authentication & Authorization

  • userin: UserIn let's App engineers to implement custom login/register feature using Identity Providers (IdPs) such as Facebook, Google, Github.

General Purposes

  • core-async: JS implementation of the Clojure core.async library aimed at implementing CSP (Concurrent Sequential Process) programming style. Designed to be used with the npm package 'co'.
  • jwt-pwd: Tiny encryption helper to manage JWT tokens and encrypt and validate passwords using methods such as md5, sha1, sha256, sha512, ripemd160.

Google Cloud Platform

  • google-cloud-bucket: Nodejs package to manage Google Cloud Buckets and perform CRUD operations against them.
  • google-cloud-bigquery: Nodejs package to manage Google Cloud BigQuery datasets, and tables and perform CRUD operations against them.
  • google-cloud-tasks: Nodejs package to push tasks to Google Cloud Tasks. Include pushing batches.

License

Copyright (c) 2017-2019, Neap Pty Ltd. All rights reserved.

Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:

  • Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
  • Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.
  • Neither the name of Neap Pty Ltd nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission.

THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL NEAP PTY LTD BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

0.0.15

5 years ago

0.0.14

5 years ago

0.0.13

5 years ago

0.0.12

5 years ago

0.0.11

5 years ago

0.0.10

5 years ago

0.0.9

5 years ago

0.0.8

5 years ago

0.0.7

5 years ago

0.0.6

5 years ago

0.0.5

5 years ago

0.0.4

5 years ago

0.0.3

5 years ago

0.0.2

5 years ago