-
Notifications
You must be signed in to change notification settings - Fork 0
/
authentication.js
99 lines (90 loc) · 3.31 KB
/
authentication.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
const { gqlRequest } = require('./api');
const scopes = "user:read projects:read projects:write company.projects:read projects.comments:write";
const refreshAccessToken = (z, bundle) => {
const promise = z.request(`https://marvelapp.com/oauth/token/`, {
method: "POST",
body: {
refresh_token: bundle.authData.refresh_token,
client_id: process.env.CLIENT_ID,
client_secret: process.env.CLIENT_SECRET,
grant_type: "refresh_token",
scope: scopes
},
headers: {
"content-type": "application/x-www-form-urlencoded"
}
});
// Needs to return `access_token`. If the refresh token stays constant, can skip it. If it changes, can
// return it here to update the user's auth on Zapier.
return promise.then(response => {
if (response.status !== 200) {
throw new Error("Unable to fetch access token: " + response.content);
}
const result = JSON.parse(response.content);
return {
access_token: result.access_token,
refresh_token: result.refresh_token
};
});
};
const testAuth = (z, bundle) => {
// This function is for zapier to test whether auth is working
const query = `query zapierAuthTest { user { email username } }`
return gqlRequest(z, bundle, query).then(response => {
if (response.status !== 200) {
throw new Error("The access token you supplied is not valid");
}
const parsedData = z.JSON.parse(response.content);
return parsedData.data.user;
});
};
const authentication = {
type: "oauth2",
test: testAuth,
// These variables are returned from 'testAuth'
connectionLabel: "Marvel - {{username}} ({{email}})",
// you can provide additional fields for inclusion in authData
oauth2Config: {
// "authorizeUrl" could also be a function returning a string url
authorizeUrl: {
method: "GET",
url: "https://marvelapp.com/oauth/authorize",
params: {
state: "{{bundle.inputData.state}}",
client_id: "{{process.env.CLIENT_ID}}",
redirect_uri: "{{bundle.inputData.redirect_uri}}",
scope: scopes,
response_type: "code"
}
},
// Zapier expects a response providing {access_token: 'abcd'}
// "getAccessToken" could also be a function returning an object
getAccessToken: {
method: "POST",
url: "https://marvelapp.com/oauth/token/",
body: {
code: "{{bundle.inputData.code}}",
client_id: "{{process.env.CLIENT_ID}}",
client_secret: "{{process.env.CLIENT_SECRET}}",
redirect_uri: "{{bundle.inputData.redirect_uri}}",
grant_type: "authorization_code"
},
headers: {
"Content-Type": "application/x-www-form-urlencoded"
}
},
refreshAccessToken: refreshAccessToken,
autoRefresh: true,
scope: scopes
},
// If you need any fields upfront, put them here
fields: [
// { key: 'subdomain', type: 'string', required: true, default: 'app' }
// For OAuth2 we store `access_token` and `refresh_token` automatically
// in `bundle.authData` for future use. If you need to save/use something
// that the user shouldn't need to type/choose, add a "computed" field, like:
// {key: 'user_id': type: 'string', required: false, computed: true}
// And remember to return it in oauth2Config.getAccessToken/refreshAccessToken
]
};
module.exports = authentication;