Skip to content

Commit 0c0ed40

Browse files
committed
Add Twitter, Google and GitHub claim issuers
1 parent 87d446c commit 0c0ed40

19 files changed

+409
-44
lines changed

Diff for: .gitignore

+2
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,8 @@ public/vendor*.js
55
public/css/app.css
66
data/db
77
data/ipfs
8+
data/OfficialIdentities.js
9+
NOTES
810
src/contracts/deployed.js
911
issuer-services/package-lock.json
1012
issuer-services/up.json

Diff for: index.js

+1-5
Original file line numberDiff line numberDiff line change
@@ -17,11 +17,7 @@ app.get('/', (req, res) => {
1717
})
1818
app.use(serveStatic('public'))
1919

20-
simpleIssuer(app, {
21-
web3: new Web3(),
22-
privateKey:
23-
'0xdb99a8d1fab57cb1d558973d2b1785232aaca4ee5e4e2224ef4a33e429cd5e00'
24-
})
20+
simpleIssuer(app, { web3: new Web3() })
2521

2622
const startGanache = () =>
2723
new Promise((resolve, reject) => {

Diff for: issuer-services/_facebook.js

+10-9
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,8 @@
33
var superagent = require('superagent')
44
var HTML = require('./html')
55

6-
module.exports = function facebook(app, { web3, facebookApp, privateKey }) {
6+
module.exports = function facebook(app, { web3, facebookApp, baseUrl }) {
7+
const redirect_uri = `${baseUrl}/fb-auth-response`
78
app.get('/fb-auth', (req, res) => {
89
if (!req.query.target) {
910
res.send('No target identity contract provided')
@@ -19,8 +20,8 @@ module.exports = function facebook(app, { web3, facebookApp, privateKey }) {
1920
req.session.state = web3.utils.randomHex(8)
2021

2122
var query = [
22-
`client_id=${facebookApp.id}`,
23-
`redirect_uri=${facebookApp.redirectURI}`,
23+
`client_id=${facebookApp.client_id}`,
24+
`redirect_uri=${redirect_uri}`,
2425
`state=${req.session.state}`
2526
]
2627
res.redirect(
@@ -47,9 +48,9 @@ module.exports = function facebook(app, { web3, facebookApp, privateKey }) {
4748
superagent
4849
.get(`https://graph.facebook.com/v2.12/oauth/access_token`)
4950
.query({
50-
client_id: facebookApp.id,
51+
client_id: facebookApp.client_id,
5152
client_secret: facebookApp.secret,
52-
redirect_uri: facebookApp.redirectURI,
53+
redirect_uri,
5354
code: req.query.code
5455
})
5556
.then(response => {
@@ -65,12 +66,12 @@ module.exports = function facebook(app, { web3, facebookApp, privateKey }) {
6566
.get(`https://graph.facebook.com/debug_token`)
6667
.query({
6768
input_token: req.userToken.access_token,
68-
access_token: `${facebookApp.id}|${facebookApp.secret}`
69+
access_token: `${facebookApp.client_id}|${facebookApp.secret}`
6970
})
7071
.then(response => {
7172
req.tokenDebug = JSON.parse(response.text).data
7273

73-
if (req.tokenDebug.app_id !== facebookApp.id) {
74+
if (req.tokenDebug.app_id !== facebookApp.client_id) {
7475
return res.send("Token's App does not match")
7576
}
7677
if (!req.tokenDebug.is_valid) {
@@ -86,7 +87,7 @@ module.exports = function facebook(app, { web3, facebookApp, privateKey }) {
8687
async (req, res) => {
8788
var data = JSON.stringify({ user_id: req.tokenDebug.user_id })
8889

89-
req.signedData = await web3.eth.accounts.sign(data, privateKey)
90+
req.signedData = await web3.eth.accounts.sign(data, facebookApp.claimSignerKey)
9091

9192
res.send(HTML(`
9293
<div class="mb-2">Successfully signed claim:</div>
@@ -100,7 +101,7 @@ module.exports = function facebook(app, { web3, facebookApp, privateKey }) {
100101
window.done = function() {
101102
window.opener.postMessage('signed-data:${
102103
req.signedData.signature
103-
}:${req.signedData.messageHash}', '*')
104+
}:${req.signedData.messageHash}:3', '*')
104105
}
105106
</script>`
106107
))

Diff for: issuer-services/_github.js

+94
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,94 @@
1+
// https://github.com/settings/developers
2+
3+
var OAuth = require('oauth').OAuth2
4+
var HTML = require('./html')
5+
var superagent = require('superagent')
6+
7+
module.exports = function facebook(app, { web3, githubApp, baseUrl }) {
8+
const redirect_uri = `${baseUrl}/github-auth-response`
9+
10+
var githubOAuth = new OAuth(
11+
githubApp.client_id,
12+
githubApp.secret,
13+
'https://github.com',
14+
'/login/oauth/authorize',
15+
'/login/oauth/access_token',
16+
null
17+
)
18+
19+
app.get('/github-auth', (req, res) => {
20+
if (!req.query.target) {
21+
res.send('No target identity contract provided')
22+
return
23+
}
24+
if (!req.query.issuer) {
25+
res.send('No issuer identity contract provided')
26+
return
27+
}
28+
29+
req.session.targetIdentity = req.query.target
30+
req.session.issuer = req.query.issuer
31+
req.session.state = web3.utils.randomHex(8)
32+
33+
var authURL = githubOAuth.getAuthorizeUrl({
34+
redirect_uri,
35+
scope: ['user'],
36+
state: req.session.state
37+
})
38+
39+
res.redirect(authURL)
40+
})
41+
42+
app.get(
43+
'/github-auth-response',
44+
(req, res, next) => {
45+
githubOAuth.getOAuthAccessToken(
46+
req.query.code,
47+
{ redirect_uri },
48+
function(e, access_token, refresh_token, results) {
49+
if (e) {
50+
next(e)
51+
} else if (results.error) {
52+
next(results.error)
53+
} else {
54+
req.access_token = access_token
55+
next()
56+
}
57+
}
58+
)
59+
},
60+
(req, res, next) => {
61+
superagent
62+
.get('https://api.github.com/user')
63+
.set('Authorization', `token ${req.access_token}`)
64+
.accept('json')
65+
.then(response => {
66+
req.githubUser = response.body
67+
next()
68+
})
69+
},
70+
async (req, res) => {
71+
var data = JSON.stringify({ user_id: req.githubUser.id })
72+
73+
req.signedData = await web3.eth.accounts.sign(data, githubApp.claimSignerKey)
74+
75+
res.send(
76+
HTML(`
77+
<div class="mb-2">Successfully signed claim:</div>
78+
<div class="mb-2"><b>Issuer:</b> ${req.session.issuer}</div>
79+
<div class="mb-2"><b>Target:</b> ${req.session.targetIdentity}</div>
80+
<div class="mb-2"><b>Data:</b> ${data}</div>
81+
<div class="mb-2"><b>Signature:</b> ${req.signedData.signature}</div>
82+
<div class="mb-2"><b>Hash:</b> ${req.signedData.messageHash}</div>
83+
<div><button class="btn btn-primary" onclick="window.done()">OK</button></div>
84+
<script>
85+
window.done = function() {
86+
window.opener.postMessage('signed-data:${
87+
req.signedData.signature
88+
}:${req.signedData.messageHash}:5', '*')
89+
}
90+
</script>`)
91+
)
92+
}
93+
)
94+
}

Diff for: issuer-services/_google.js

+99
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,99 @@
1+
// https://console.developers.google.com/apis/credentials
2+
3+
var OAuth = require('oauth').OAuth2
4+
var HTML = require('./html')
5+
var superagent = require('superagent')
6+
7+
module.exports = function facebook(app, { web3, googleApp, baseUrl }) {
8+
const redirect_uri = `${baseUrl}/google-auth-response`
9+
10+
var googleOAuth = new OAuth(
11+
googleApp.client_id,
12+
googleApp.secret,
13+
'https://accounts.google.com',
14+
'/o/oauth2/auth',
15+
'/o/oauth2/token'
16+
)
17+
18+
app.get('/google-auth', (req, res) => {
19+
if (!req.query.target) {
20+
res.send('No target identity contract provided')
21+
return
22+
}
23+
if (!req.query.issuer) {
24+
res.send('No issuer identity contract provided')
25+
return
26+
}
27+
28+
req.session.targetIdentity = req.query.target
29+
req.session.issuer = req.query.issuer
30+
req.session.state = web3.utils.randomHex(8)
31+
32+
var authURL = googleOAuth.getAuthorizeUrl({
33+
redirect_uri,
34+
scope: 'https://www.googleapis.com/auth/userinfo.profile',
35+
state: req.session.state,
36+
response_type: 'code'
37+
})
38+
39+
res.redirect(authURL)
40+
})
41+
42+
app.get(
43+
'/google-auth-response',
44+
(req, res, next) => {
45+
googleOAuth.getOAuthAccessToken(
46+
req.query.code,
47+
{
48+
redirect_uri,
49+
grant_type: 'authorization_code'
50+
},
51+
function(e, access_token, refresh_token, results) {
52+
if (e) {
53+
next(e)
54+
} else if (results.error) {
55+
next(results.error)
56+
} else {
57+
req.access_token = access_token
58+
next()
59+
}
60+
}
61+
)
62+
},
63+
(req, res, next) => {
64+
superagent
65+
.get('https://www.googleapis.com/oauth2/v1/userinfo')
66+
.query({
67+
alt: 'json',
68+
access_token: req.access_token
69+
})
70+
.then(response => {
71+
req.googleUser = response.body
72+
next()
73+
})
74+
},
75+
async (req, res) => {
76+
var data = JSON.stringify({ user_id: req.googleUser.id })
77+
78+
req.signedData = await web3.eth.accounts.sign(data, googleApp.claimSignerKey)
79+
80+
res.send(
81+
HTML(`
82+
<div class="mb-2">Successfully signed claim:</div>
83+
<div class="mb-2"><b>Issuer:</b> ${req.session.issuer}</div>
84+
<div class="mb-2"><b>Target:</b> ${req.session.targetIdentity}</div>
85+
<div class="mb-2"><b>Data:</b> ${data}</div>
86+
<div class="mb-2"><b>Signature:</b> ${req.signedData.signature}</div>
87+
<div class="mb-2"><b>Hash:</b> ${req.signedData.messageHash}</div>
88+
<div><button class="btn btn-primary" onclick="window.done()">OK</button></div>
89+
<script>
90+
window.done = function() {
91+
window.opener.postMessage('signed-data:${
92+
req.signedData.signature
93+
}:${req.signedData.messageHash}:6', '*')
94+
}
95+
</script>`)
96+
)
97+
}
98+
)
99+
}

Diff for: issuer-services/_simple.js

+3-3
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
var HTML = require('./html')
22

3-
module.exports = function dummyService(app, { web3, privateKey }) {
3+
module.exports = function dummyService(app, { web3, simpleApp }) {
44

55
app.get('/simple-auth', async (req, res) => {
66
var issuer = req.query.issuer,
@@ -14,13 +14,13 @@ module.exports = function dummyService(app, { web3, privateKey }) {
1414
res.send(HTML('No issuer identity contract provided'))
1515
return
1616
}
17-
if (!privateKey) {
17+
if (!simpleApp.claimSignerKey) {
1818
res.send(HTML('No private key specified.'))
1919
return
2020
}
2121

2222
var data = 'Identity Verified OK!'
23-
var signedData = await web3.eth.accounts.sign(data, privateKey)
23+
var signedData = await web3.eth.accounts.sign(data, simpleApp.claimSignerKey)
2424

2525
res.send(
2626
HTML(

0 commit comments

Comments
 (0)