Group social login for ReactJS
- Github
- Microsoft
- Amazon
This repository includes multiple platform for social login, is written by TypeScript and React Hooks, tree-shakeable, zero dependencies, extremely lightweight. You can customize any style UI as you like.
Reactjs Social Login is an HOC which provides social login through multiple providers.
Currently supports Amazon, Facebook, GitHub, Google, Instagram, Linkedin, Pinterest, Twitter, Microsoft as providers (more to come!)
npm install --save reactjs-social-loginClone project, open terminal and type these commands
npm installnpm run startthen go to directory /example, add .env.development by following format
NODE_ENV=development
REACT_APP_FB_APP_ID=
REACT_APP_GG_APP_ID=
REACT_APP_AMAZON_APP_ID=
REACT_APP_INSTAGRAM_APP_ID=
REACT_APP_INSTAGRAM_APP_SECRET=
REACT_APP_MICROSOFT_APP_ID=
REACT_APP_LINKEDIN_APP_SECRET=
REACT_APP_LINKEDIN_APP_ID=
REACT_APP_GITHUB_APP_ID=
REACT_APP_GITHUB_APP_SECRET=
REACT_APP_PINTEREST_APP_ID=
REACT_APP_PINTEREST_APP_SECRET=
REACT_APP_TWITTER_APP_ID=
REACT_APP_TWITTER_API_KEY=
REACT_APP_TWITTER_APP_SECRET=
REACT_APP_TWITTER_TOKEN=and on directory /example, then open other terminal, type these commands
npm run startYou can then view the demo at [https://localhost:3000][demo].
import React, { useCallback, useRef, useState } from 'react'
import './app.css'
import { User } from './User' // component display user (see detail on /example directory)
import {
LoginSocialGoogle,
LoginSocialAmazon,
LoginSocialFacebook,
LoginSocialGithub,
LoginSocialInstagram,
LoginSocialLinkedin,
LoginSocialMicrosoft,
LoginSocialPinterest,
LoginSocialTwitter,
IResolveParams,
} from 'reactjs-social-login'
// CUSTOMIZE ANY UI BUTTON
import {
FacebookLoginButton,
GoogleLoginButton,
GithubLoginButton,
AmazonLoginButton,
InstagramLoginButton,
LinkedInLoginButton,
MicrosoftLoginButton,
TwitterLoginButton
} from 'react-social-login-buttons'
import { ReactComponent as PinterestLogo } from './assets/pinterest.svg'
const REDIRECT_URI = 'http://localhost:3000/account/login'
const App = () => {
const [provider, setProvider] = useState('')
const [profile, setProfile] = useState<any>()
const onLoginStart = useCallback(() => {
alert('login start')
}, [])
const onLogoutSuccess = useCallback(() => {
setProfile(null)
setProvider('')
alert('logout success')
}, [])
return (
<>
{provider && profile ? (
<User provider={provider} profile={profile} onLogout={onLogoutSuccess} />
) : (
<div className={`App ${provider && profile ? 'hide' : ''}`}>
<h1 className='title'>ReactJS Social Login</h1>
<LoginSocialFacebook
appId={process.env.REACT_APP_FB_APP_ID || ''}
onLoginStart={onLoginStart}
onResolve={({ provider, data }: IResolveParams) => {
setProvider(provider)
setProfile(data)
}}
onReject={(err) => {
console.log(err)
}}
>
<FacebookLoginButton />
</LoginSocialFacebook>
<LoginSocialGoogle
client_id={process.env.REACT_APP_GG_APP_ID || ''}
onLoginStart={onLoginStart}
onResolve={({ provider, data }: IResolveParams) => {
setProvider(provider)
setProfile(data)
}}
onReject={(err) => {
console.log(err)
}}
>
<GoogleLoginButton />
</LoginSocialGoogle>
<LoginSocialAmazon
client_id={process.env.REACT_APP_AMAZON_APP_ID || ''}
redirect_uri={REDIRECT_URI}
onResolve={({ provider, data }: IResolveParams) => {
setProvider(provider)
setProfile(data)
}}
onReject={(err: any) => {
console.log(err)
}}
onLoginStart={onLoginStart}
>
<AmazonLoginButton />
</LoginSocialAmazon>
<LoginSocialInstagram
client_id={process.env.REACT_APP_INSTAGRAM_APP_ID || ''}
client_secret={process.env.REACT_APP_INSTAGRAM_APP_SECRET || ''}
redirect_uri={REDIRECT_URI}
onLoginStart={onLoginStart}
onResolve={({ provider, data }: IResolveParams) => {
setProvider(provider)
setProfile(data)
}}
onReject={(err: any) => {
console.log(err)
}}
>
<InstagramLoginButton />
</LoginSocialInstagram>
<LoginSocialMicrosoft
client_id={process.env.REACT_APP_MICROSOFT_APP_ID || ''}
redirect_uri={REDIRECT_URI}
onLoginStart={onLoginStart}
onResolve={({ provider, data }: IResolveParams) => {
setProvider(provider)
setProfile(data)
}}
onReject={(err: any) => {
console.log(err)
}}
>
<MicrosoftLoginButton />
</LoginSocialMicrosoft>
<LoginSocialLinkedin
client_id={process.env.REACT_APP_LINKEDIN_APP_ID || ''}
client_secret={process.env.REACT_APP_LINKEDIN_APP_SECRET || ''}
redirect_uri={REDIRECT_URI}
onLoginStart={onLoginStart}
onResolve={({ provider, data }: IResolveParams) => {
setProvider(provider)
setProfile(data)
}}
onReject={(err: any) => {
console.log(err)
}}
>
<LinkedInLoginButton />
</LoginSocialLinkedin>
<LoginSocialGithub
client_id={process.env.REACT_APP_GITHUB_APP_ID || ''}
client_secret={process.env.REACT_APP_GITHUB_APP_SECRET || ''}
redirect_uri={REDIRECT_URI}
onLoginStart={onLoginStart}
onResolve={({ provider, data }: IResolveParams) => {
setProvider(provider)
setProfile(data)
}}
onReject={(err: any) => {
console.log(err)
}}
>
<GithubLoginButton />
</LoginSocialGithub>
<LoginSocialPinterest
client_id={process.env.REACT_APP_PINTEREST_APP_ID || ''}
client_secret={process.env.REACT_APP_PINTEREST_APP_SECRET || ''}
redirect_uri={REDIRECT_URI}
onLoginStart={onLoginStart}
onResolve={({ provider, data }: IResolveParams) => {
setProvider(provider)
setProfile(data)
}}
onReject={(err: any) => {
console.log(err)
}}
className='pinterest-btn'
>
<div className='content'>
<div className='icon'>
<PinterestLogo />
</div>
<span className='txt'>Login With Pinterest</span>
</div>
</LoginSocialPinterest>
<LoginSocialTwitter
client_id={process.env.REACT_APP_TWITTER_API_KEY || ''}
client_secret={process.env.REACT_APP_TWITTER_APP_SECRET || ''}
redirect_uri={REDIRECT_URI}
onLoginStart={onLoginStart}
onResolve={({ provider, data }: IResolveParams) => {
setProvider(provider)
setProfile(data)
}}
onReject={(err: any) => {
console.log(err)
}}
>
<TwitterLoginButton />
</LoginSocialTwitter>
</div>
)}
</>
)
}
export default App| Prop | Type | Default | Description |
|---|---|---|---|
| onResolve | function({provider, data}) { // } (required) |
- |
Return provider and data (include user's info & access_token,...) |
| onReject | function(err) { // } (required) |
- |
Return error |
| onLoginStart | function() { // } (optional) |
- |
Called when click login |
| client_id | string (required) |
- |
ID application |
| className | string (optional) |
- |
Class container |
| other_props... |
| Prop | Type | Default | Description |
|---|---|---|---|
| onResolve | function({provider, data}) { // } (required) |
- |
Return provider and data (include user's info & access_token,...) |
| onReject | function(err) { // } (required) |
- |
Return error |
| appId | string (required) |
- |
ID application |
| onLoginStart | function() { // } (optional) |
- |
Called when click login |
| other_props... |
| Prop | Type | Default | Description |
|---|---|---|---|
| onResolve | function({provider, data}) { // } (required) |
- |
Return provider and data (include user's info & access_token,...) |
| onReject | function(err) { // } (required) |
- |
Return error |
| client_id | string (required) |
- |
ID application |
| onLoginStart | function() { // } (optional) |
- |
Called when click login |
| className | string (optional) |
- |
Class for button |
| other_props... |
| Prop | Type | Default | Description |
|---|---|---|---|
| onResolve | function({provider, data}) { // } (required) |
- |
Return provider and data (include user's info & access_token,...) |
| onReject | function(err) { // } (required) |
- |
Return error |
| client_id | string (required) |
- |
ID application |
| onLoginStart | function() { // } (optional) |
- |
Called when click login |
| className | string (optional) |
- |
Class for button |
| other_props... |
| Prop | Type | Default | Description |
|---|---|---|---|
| onResolve | function({provider, data}) { // } (required) |
- |
Return provider and data (include user's info & access_token,...) |
| onReject | function(err) { // } (required) |
- |
Return error |
| client_id | string (required) |
- |
App ID application |
| client_secret | string (required) |
- |
App Secret application |
| onLoginStart | function() { // } (optional) |
- |
Called when click login |
| className | string (optional) |
- |
Class for button |
| other_props... |
| Prop | Type | Default | Description |
|---|---|---|---|
| onResolve | function({provider, data}) { // } (required) |
- |
Return provider and data (include user's info & access_token,...) |
| onReject | function(err) { // } (required) |
- |
Return error |
| client_id | string (required) |
- |
App ID application |
| client_secret | string (required) |
- |
App Secret application |
| onLoginStart | function() { // } (optional) |
- |
Called when click login |
| className | string (optional) |
- |
Class for button |
| scope | string (optional) |
- |
Scope application |
| other_props... |
| Prop | Type | Default | Description |
|---|---|---|---|
| onResolve | function({provider, data}) { // } (required) |
- |
Return provider and data (include user's info & access_token,...) |
| onReject | function(err) { // } (required) |
- |
Return error |
| client_id | string (required) |
- |
App ID application |
| client_secret | string (required) |
- |
Secret ID application |
| onLoginStart | function() { // } (optional) |
- |
Called when click login |
| className | string (optional) |
- |
Class for button |
| other_props... |
| Prop | Type | Default | Description |
|---|---|---|---|
| onResolve | function({provider, data}) { // } (required) |
- |
Return provider and data (include user's info & access_token,...) |
| onReject | function(err) { // } (required) |
- |
Return error |
| client_id | string (required) |
- |
App ID application |
| client_secret | string (required) |
- |
Secret ID application |
| onLoginStart | function() { // } (optional) |
- |
Called when click login |
| className | string (optional) |
- |
Class for button |
| other_props... |
| Prop | Type | Default | Description |
|---|---|---|---|
| onResolve | function({provider, data}) { // } (required) |
- |
Return provider and data (include user's info & access_token,...) |
| onReject | function(err) { // } (required) |
- |
Return error |
| client_id | string (required) |
- |
API Key |
| client_secret | string (required) |
- |
Secret Key |
| onLoginStart | function() { // } (optional) |
- |
Called when click login |
| className | string (optional) |
- |
Class for button |
| other_props... |
Create application developer and you can get detail id & secret_id on these link
MIT © Nguyen-Manh-Cuong
