Skip to content

Commit a1b5f0e

Browse files
Paulo Cabralwaldyrious
authored andcommitted
Add js Auth example with WEB server Flow
1 parent 02e87b0 commit a1b5f0e

File tree

7 files changed

+1400
-0
lines changed

7 files changed

+1400
-0
lines changed
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
# Base Url endpoint
2+
BASE_URL='https://api-sandbox.uphold.com'
3+
4+
CLIENT_ID = ''
5+
CLIENT_SECRET = ''
6+
SERVER_PORT = 3000
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
# Client credentials web-flow
2+
3+
This sample project demonstrates how to authenticate in the Uphold API using the client credentials web flow. For further background, please refer to the [API documentation](https://uphold.com/en/developer/api/documentation)
4+
5+
## Summary
6+
**Ideal for web applications** that wish to retrieve information about a user’s Uphold account or take actions on their behalf.
7+
This example tries to mimic the WEB-FLOW cycle. It creates a simple webserver and tries to run the entire cycle of authenticating against UPHOLD servers and return the token to this web server.
8+
9+
```
10+
https://sandbox.uphold.com/authorize/PUT_HERE_YOUR_CLIENT_ID?scope=user:read&state=PUT_A_CODE_HERE_TO_IDENTIFY_THE_REQUEST
11+
```
12+
13+
## Requirements
14+
- `node` v13.14.0 +
15+
16+
## Setup
17+
- run `npm install` (or `yarn install`)
18+
- create a `.env` file based on the `.env.example` file, and populate it with the required data
19+
20+
## Run
21+
- run `node index.js`
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
-----BEGIN CERTIFICATE-----
2+
MIIEljCCAn4CCQCHHmqArzJctTANBgkqhkiG9w0BAQsFADANMQswCQYDVQQGEwJw
3+
dDAeFw0yMDEwMjIxMzE1MTlaFw0yMTEwMjIxMzE1MTlaMA0xCzAJBgNVBAYTAnB0
4+
MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEArsxVWb12Rmn7oocPIXe5
5+
SgiiRAqS4pZ2jnpxkN2rYp8sBBZCYAkRFNfIh+SUoOVPUhrM5JDZ9stmPHAba/XO
6+
oOhhq4paI082TqBiBqqjYtofqdKp3FjMLXcV+Y1jYnphZ6U+eZKsLUc0hWCK/TFa
7+
6H5Y3EUip9t8xmNRkzo2xhd5gNTEsvFMx/1XzJVJ7T5kgjKF+SECEw3leQva1RPK
8+
g7+REF1McZlWqav8Y/qEQ3ZS1AIJLEHG0x1rSE9zf0PHiTYecPbYYLwMccHorKua
9+
owjQKt9MboFN5u+Ne99sTyLuemDBmBFEI87ecBBCDzQb/bOQoqKJDY4u1xjO5Crf
10+
tvVgZoGkwlXobJZ4r02Zfh338dXCIbTw9tXNV0sGtdiDMD3uPDq7+pU7mjWIcWjb
11+
1hNVFxOO5Bna42r8q53QkfibKTVEZZaZmOu9vosOBGa4YsYUXvh0N1TqS7jNYv2H
12+
vTdKYZnJvEoFj4bXEpyA8Dk/roybij19l0d5w6SR34Aq1M63NxGwph4CiCJ2SMGU
13+
u+y048/XH64Bn1GjE19yyZ8JKi6tiENY6m9WS4BDGFiAOL5XkthcUmI5j8yaHncr
14+
iSIJmfEiwL3ZCiUzD3Ua3l5oSK+aG5hf7FU9rXNYnt6byerrZasZnGi8U4y4CzLA
15+
VEdfuklz3fBUVqz2fU6cFEkCAwEAATANBgkqhkiG9w0BAQsFAAOCAgEAW9j6giBn
16+
iiphY4GMuQlQr3mf/rrtqCDIV+SAkhi/IzKbk4x/5yXoLZ2r9FbcZmNigBjQqB16
17+
V0YN2lNYFiSF9Sx9Qv8XIFXYyPIKucHKekGASDk8oqmPtHQYBH9hOTRN8SRaT7aQ
18+
rV1pYqdkjjG4gtjauYTAXucgQjP7d4kj8jOadZCffN53/6ASPRkj/Q+vpUlj0dxd
19+
tjrEi1NxwbHahi59UggTg6ftLTgIMOHJYWMyTuR++B8m+UT6bFpPxB5enfcL+Qg9
20+
4cTK0MtebyIIXmXv2L5S56/En+Kvlq3ynRFlqq9kdHK80kqjmPw6D2A+RHka1nDb
21+
uo61ZPxBznMk9s8SJix+lv3MvinOJCiJDjYhef0rZXSSUEmXa58IF7iZdV+SIlUp
22+
bEbEpCvVqBgc8XDoVcSp96rpZDSuSYfU7Xz9McyFbOtq+NkEtDevxE8r3WqIBh9x
23+
efss+CBkrdGyj5qyBTd8YyLKvY3fsPfS08BMN7cMZVw8wsICymAGUFHk5Do3RFxM
24+
tgD1VE26v0cluQwguYWZgRLR9lK1vREs7OfRb4RaXLczArOza5o4JTwmPByZ7owT
25+
PzK3H9ydn9oq8LoRoY+9s3IRgdRQSD/idf/QylsZ9Es4av9LO+6pvmO+Sr/rnIQb
26+
Gg6t7OPvwYNi62kS7eywQNbbfIB6wX0h/iw=
27+
-----END CERTIFICATE-----
Lines changed: 110 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,110 @@
1+
/**
2+
* Dependencies.
3+
*/
4+
import axios from "axios";
5+
import b64Pkg from "js-base64";
6+
import dotenv from "dotenv";
7+
import express from "express";
8+
import fs from "fs";
9+
import https from "https";
10+
import qs from "qs";
11+
import path from "path";
12+
13+
const { encode } = b64Pkg;
14+
dotenv.config({ path: path.resolve() + "/.env" });
15+
16+
// For testing purposes point your browser to the fallowing URL
17+
// https://sandbox.uphold.com/authorize/PUT_HERE_YOUR_CLIENT_ID?scope=user:read&state=PUT_A_CODE_STATE_HERE
18+
19+
/**
20+
* Get assets.
21+
*/
22+
async function getAssets(token) {
23+
try {
24+
const r = await axios.get(`${process.env.BASE_URL}/v0/assets`, {
25+
headers: {
26+
Authorization: `${token.token_type} ${token.access_token}`,
27+
},
28+
});
29+
return r.data;
30+
} catch (error) {
31+
console.log(JSON.stringify(error, null, 2));
32+
throw error;
33+
}
34+
}
35+
36+
/**
37+
* Get Token.
38+
*/
39+
async function getToken(code) {
40+
// auth encoded with client ID and Client Secret
41+
// set post options for axios
42+
43+
const auth = encode(process.env.CLIENT_ID + ":" + process.env.CLIENT_SECRET);
44+
const url = `${process.env.BASE_URL}/oauth2/token`;
45+
46+
const options = {
47+
method: "POST",
48+
headers: {
49+
Authorization: "Basic " + auth,
50+
"content-type": "application/x-www-form-urlencoded",
51+
},
52+
data: qs.stringify({ code, grant_type: "client_credentials" }),
53+
url,
54+
};
55+
56+
const data = axios(options)
57+
.then((response) => {
58+
return response.data;
59+
})
60+
.catch((error) => {
61+
error.response.data.errors
62+
? console.log(JSON.stringify(error.response.data.errors, null, 2))
63+
: console.log(JSON.stringify(error, null, 2));
64+
throw error;
65+
});
66+
67+
return data;
68+
}
69+
70+
const app = express();
71+
const hostname = "localhost";
72+
const port = process.env.USERNAME || 3000;
73+
74+
/**
75+
* Callback url endpoint.
76+
*/
77+
78+
app.get("/callback", async (req, res) => {
79+
// Do we have a code?
80+
// WARNING!!!!! The code only works for 5 minutes
81+
if (req.query.code) {
82+
console.log(`code ${req.query.code}`);
83+
84+
const token = await getToken(req.query.code);
85+
const assets = await getAssets(token);
86+
87+
console.log(token);
88+
console.log(assets);
89+
res.send("All done !");
90+
} else {
91+
res.send(`Oops, something went wrong... did you pass the STATE?`);
92+
}
93+
});
94+
95+
/**
96+
* Run server.
97+
*/
98+
99+
https
100+
.createServer(
101+
{
102+
key: fs.readFileSync("./key.pem"),
103+
cert: fs.readFileSync("./cert.pem"),
104+
passphrase: "test",
105+
},
106+
app
107+
)
108+
.listen(port, () => {
109+
console.log(`Serving running at https://${hostname}:${port}/`);
110+
});
Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
-----BEGIN ENCRYPTED PRIVATE KEY-----
2+
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
53+
idnWYlp+GmR0sckgYM6+f3R+PQ==
54+
-----END ENCRYPTED PRIVATE KEY-----
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
{
2+
"name": "uphold-wap",
3+
"version": "0.0.1",
4+
"description": "Uphold rest Api test web application flow example",
5+
"license": "MIT",
6+
"type": "module",
7+
"main": "app.js",
8+
"dependencies": {
9+
"axios": "^0.20.0",
10+
"dotenv": "^8.2.0",
11+
"express": "^4.17.1",
12+
"js-base64": "^3.5.2",
13+
"nodemon": "^2.0.2"
14+
},
15+
"engines": {
16+
"node": ">=13"
17+
},
18+
"scripts": {
19+
"run": "nodemon --inspect index.js "
20+
}
21+
}

0 commit comments

Comments
 (0)