/
facebookVerifier.js
78 lines (58 loc) · 1.95 KB
/
facebookVerifier.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
// @flow
import Axios from 'axios'
import { isPlainObject, get } from 'lodash'
import Config from '../server/server.config'
import logger from '../imports/logger'
const defaultLogger = logger.child({ from: 'FacebookVerifier' })
class FacebookVerifier {
static factory(logger = null) {
const log = logger || defaultLogger
return new FacebookVerifier(Config, Axios.create, log)
}
constructor(Config, httpFactory, logger) {
const { facebookGraphApiUrl } = Config
this.logger = logger
this.http = httpFactory({
baseURL: facebookGraphApiUrl,
headers: {
Accept: 'application/json',
'Content-Type': 'application/json'
}
})
this._configureResponses()
}
async verifyEmail(userEmail, accessToken, logger) {
const { http } = this
logger = logger || this.logger
const params = { fields: 'email', access_token: accessToken }
const userInfo = await http.get('/me', { params })
logger.info('verifyEmail', { userInfo })
if (!('email' in userInfo)) {
throw new Error(
"Couldn't verify email: user hasn't confirmed it on Facebook or has used mobile phone number for sign in."
)
}
return userEmail === userInfo.email
}
_configureResponses() {
const { http, _transformResponse } = this
const { response } = http.interceptors
response.use(_transformResponse, exception => this._exceptionInterceptor(exception))
}
_transformResponse(response) {
return get(response, 'data', {})
}
_exceptionInterceptor(exception) {
const { response, message } = exception
if (response && isPlainObject(response.data)) {
const graphResponse = this._transformResponse(response)
const { message: graphMessage } = get(graphResponse, 'error', {})
exception.message = graphMessage || message
exception.response = graphResponse
} else {
delete exception.response
}
throw exception
}
}
export default FacebookVerifier