forked from prisma-archive/graphcool-templates
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathfirebaseAuthentication.js
104 lines (90 loc) · 2.59 KB
/
firebaseAuthentication.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
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
const fromEvent = require('graphcool-lib').fromEvent
const firebase = require('firebase')
const admin = require("firebase-admin")
const serviceAccount = {
"type": "",
"project_id": "",
"private_key_id": "",
"private_key": "",
"client_email": "",
"client_id": "",
"auth_uri": "",
"token_uri": "",
"auth_provider_x509_cert_url": "",
"client_x509_cert_url": ""
}
const getGraphcoolUser = (firebaseUserId, api) => {
return api.request(`
query {
User(firebaseUserId: "${firebaseUserId}"){
id
}
}`
).then(userQueryResult => {
if (userQueryResult.error) {
return Promise.reject(userQueryResult.error)
} else {
return userQueryResult.User
}
}
)
}
const createGraphcoolUser = (firebaseUserId, api) => {
return api.request(`
mutation {
createUser(
firebaseUserId:"${firebaseUserId}"
){
id
}
}`)
.then(userMutationResult => {
console.log(`Mutation result: ${JSON.stringify(userMutationResult)}`)
return userMutationResult.createUser.id
})
}
const getOrCreateGraphcoolUser = (firebaseUserId, api) => {
return getGraphcoolUser(firebaseUserId, api)
.then(graphcoolUser => {
if (!graphcoolUser) {
console.log('Create Graphcool user...')
return createGraphcoolUser(firebaseUserId, api)
} else {
console.log(`Graphcool user id: ${JSON.stringify(graphcoolUser)}`)
return graphcoolUser.id
}
})
}
module.exports = event => {
const firebaseIdToken = event.data.firebaseIdToken
const graphcool = fromEvent(event)
const api = graphcool.api('simple/v1')
admin.initializeApp({
credential: admin.credential.cert(serviceAccount),
databaseURL: "https://gc-auth-demo.firebaseio.com"
})
return admin.auth().verifyIdToken(firebaseIdToken)
.then(decodedToken => {
const firebaseUserId = decodedToken.uid
return getOrCreateGraphcoolUser(firebaseUserId, api)
.then(graphcoolUserId => {
console.log(`Graphcool user: ${graphcoolUserId}`)
return graphcool.generateAuthToken(graphcoolUserId, 'User')
})
.then(token => {
console.log(`Return token: ${token}`)
return { data: { token } }
})
.catch(error => {
console.log(`Error: ${JSON.stringify(error)}}`)
return {
error: 'An unexpected error occured'
}
})
}).catch(error => {
console.log(`Firebase ID token not valid`)
return {
error: 'Firebase ID token not valid'
}
})
}