Skip to content
This repository was archived by the owner on Jun 28, 2021. It is now read-only.

Commit 28b7eaa

Browse files
authored
Devise Token Auth for one quran (#571)
* Devise Token Auth for one quran * pr comments
1 parent 1939f55 commit 28b7eaa

File tree

14 files changed

+121
-18
lines changed

14 files changed

+121
-18
lines changed
Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
import React from 'react';
2+
import { connect } from 'react-redux';
3+
4+
import { save } from 'redux/actions/auth';
5+
import { push } from 'react-router-redux';
6+
7+
const styles = require('./style.scss');
8+
9+
const FacebookTokenButton = ({ save, push }) => { // eslint-disable-line
10+
let popup = null;
11+
let interval = null;
12+
13+
const handleClick = () => {
14+
popup = window.open('/onequran/omniauth/facebook?omniauth_window_type=newWindow&resource_class=User', '_blank'); // eslint-disable-line
15+
interval = setInterval(() => popup.postMessage('requestCredentials', '*'), 1000);
16+
17+
window.addEventListener('message', (event) => { // eslint-disable-line
18+
if (event.data.uid) {
19+
save(event.data);
20+
clearInterval(interval);
21+
22+
return push('/');
23+
}
24+
}, false);
25+
};
26+
27+
return (
28+
<button onClick={handleClick} className={`${styles.button} btn btn-default btn-block btn-lg`}>
29+
<i className="fa fa-facebook" /> Continue with Facebook
30+
</button>
31+
);
32+
};
33+
34+
export default connect(null, { save, push })(FacebookTokenButton);
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
.button{
2+
background: #3B5998;
3+
border-color: #3B5998;
4+
color: #fff;
5+
font-weight: 300;
6+
}

src/components/IndexHeader/Nav/index.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -75,7 +75,7 @@ export class IndexHeaderNav extends Component {
7575
user &&
7676
<li>
7777
<Link to="/profile" data-metrics-event-name="IndexHeader:Link:Profile">
78-
{user.firstName}
78+
{user.firstName || user.name}
7979
</Link>
8080
</li>
8181
}

src/containers/Login/index.js

Lines changed: 22 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,28 @@
11
import React from 'react';
22

3-
import FacebookButton from 'components/FacebookButton';
3+
import FacebookTokenButton from 'components/FacebookTokenButton';
4+
import LocaleFormattedMessage from 'components/LocaleFormattedMessage';
5+
6+
const logo = require('../../../static/images/logo-lg.png');
47

58
export default () => (
6-
<div>
7-
<FacebookButton />
9+
<div className="row" style={{ paddingTop: '10vh' }}>
10+
<div className="col-md-4 col-md-offset-4">
11+
<div className="panel panel-default">
12+
<div className="panel-body">
13+
<div className="text-center">
14+
<img src={logo} alt="logo" width="30%" />
15+
<h3 style={{ color: '#000' }}>Quran.com</h3>
16+
</div>
17+
<p>
18+
<LocaleFormattedMessage
19+
id="login.message"
20+
default="Sign in to Quran.com to store all your bookmarks, notes and activities."
21+
/>
22+
</p>
23+
<FacebookTokenButton />
24+
</div>
25+
</div>
26+
</div>
827
</div>
928
);

src/containers/Profile/index.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ class Profile extends Component { // eslint-disable-line
2424
const { user, bookmarks } = this.props;
2525

2626
return (
27-
<div>
27+
<div className="min-container">
2828
<Helmet title="The Noble Quran - القرآن الكريم" titleTemplate="%s" />
2929
<QuranNav />
3030
<div className={styles.header} />

src/helpers/ApiClient.js

Lines changed: 14 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -38,8 +38,9 @@ export default class {
3838
}));
3939
}
4040

41-
if (cookie.load('accessToken')) {
42-
request.set('Authorization', `Bearer ${cookie.load('accessToken')}`);
41+
if (cookie.load('auth')) {
42+
const headers = cookie.load('auth');
43+
Object.keys(headers).forEach(key => request.set(key, headers[key]));
4344
}
4445

4546
if (__SERVER__ && req.get('cookie')) {
@@ -50,11 +51,21 @@ export default class {
5051
request.send(decamelizeKeys(data));
5152
}
5253

53-
request.end((err, { body } = {}) => {
54+
request.end((err, { header, body } = {}) => {
5455
if (err) {
5556
return reject(body || err);
5657
}
5758

59+
if (header['access-token']) {
60+
cookie.save('auth', {
61+
'access-token': header['access-token'],
62+
client: header.client,
63+
expiry: header.expiry,
64+
uid: header.uid,
65+
'token-type': 'Bearer'
66+
});
67+
}
68+
5869
return resolve(body);
5970
});
6071
});

src/locale/ar.js

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,8 @@ export default {
6868
'nav.aboutQuranProject': 'Quran.com المعروف أيضا باسم القرآن الكريم، قناة القرآن الكريم، القرآن الكريم، القرآن الكريم) هو مشروع خيري)', // eslint-disable-line max-len
6969
'nav.mobile': 'التليفون المحمول',
7070
'nav.navigate': 'انتقل',
71-
'nav.legacySite': 'الموقع القديم'
71+
'nav.legacySite': 'الموقع القديم',
72+
73+
'login.message': 'تسجيل الدخول إلى Quran.com لتخزين كل ما تبذلونه من العناوين والملاحظات والأنشطة.'
7274
}
7375
};

src/locale/en.js

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -61,13 +61,15 @@ export default {
6161

6262
'nav.contribute': 'Contribute',
6363
'nav.aboutUs': 'About us',
64-
'nav.developers': 'developers',
64+
'nav.developers': 'Developers',
6565
'nav.usefulSites': 'Useful sites',
6666
'nav.otherLinks': 'Other links',
6767
'nav.contactUs': 'Contact us',
6868
'nav.aboutQuranProject': 'Quran.com (also known as The Noble Quran, Al Quran, Holy Quran, Koran) is a pro bono project.', // eslint-disable-line max-len
6969
'nav.mobile': 'Mobile',
7070
'nav.navigate': 'Navigate',
71-
'nav.legacySite': 'Legacy Quran.com'
71+
'nav.legacySite': 'Legacy Quran.com',
72+
73+
'login.message': 'Sign in to Quran.com to store all your bookmarks, notes and activities.'
7274
}
7375
};

src/locale/ur.js

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,8 @@ export default {
6868
'nav.aboutQuranProject': 'قرآن کریم ایک فلاں عامہ (عوامی بہبود کے لئے) منصوبہ ہے',
6969
'nav.mobile': 'موبائل',
7070
'nav.navigate': 'تشریف لے جائیں',
71-
'nav.legacySite': 'پرانی سائٹ'
71+
'nav.legacySite': 'پرانی سائٹ',
72+
73+
'login.message': 'Quran.com کرنے کیلئے سائن ان سب کو اپنے بک مارکس، نوٹوں اور سرگرمیوں کو ذخیرہ کرنے.'
7274
}
7375
};

src/redux/actions/auth.js

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import {
55
FACEBOOK_SUCCESS,
66
FACEBOOK_FAILURE,
77
LOGOUT_SUCCESS,
8+
SAVE,
89
LOAD,
910
LOAD_SUCCESS,
1011
LOAD_FAILURE
@@ -17,17 +18,21 @@ export function isLoaded(globalState) {
1718
export function load() {
1819
return {
1920
types: [LOAD, LOAD_SUCCESS, LOAD_FAILURE],
20-
promise: client => client.get('/onequran/api/v1/auth/current')
21+
promise: client => client.get('/onequran/auth/validate_token')
2122
};
2223
}
2324

2425
export function facebook() {
2526
return {
2627
types: [FACEBOOK, FACEBOOK_SUCCESS, FACEBOOK_FAILURE],
27-
promise: client => client.get('/onequran/auth/facebook/callback')
2828
};
2929
}
3030

31+
export const save = data => ({
32+
type: SAVE,
33+
data
34+
});
35+
3136
export function logout() {
3237
return {
3338
type: LOGOUT_SUCCESS

0 commit comments

Comments
 (0)