Skip to content

Commit 814a7c7

Browse files
committed
switched from using slacks login oauth to the add slack app oauth instead - oauth fully implemented - refactored a few files in SlackLoginWindow component
1 parent b3f336a commit 814a7c7

File tree

4 files changed

+117
-44
lines changed

4 files changed

+117
-44
lines changed

.vsls.json

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
{
2+
"$schema": "http://json.schemastore.org/vsls",
3+
"gitignore":"none"
4+
}

src-electron/main-process/electron-main.js

Lines changed: 61 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { app, BrowserWindow, net, shell, ipcMain } from "electron";
1+
import { app, BrowserWindow, net } from "electron";
22
import { Deeplink } from "electron-deeplink";
33
import isDev from "electron-is-dev";
44
import jwt_decode from 'jwt-decode';
@@ -43,35 +43,26 @@ const deeplink = new Deeplink({
4343
// logEverywhere(`electron path: ${require('path').join(__dirname, '../../node_modules/electron/dist/electron.exe')}`);
4444
// Sends request to Slack for User's information,
4545
// then sends user information back to renderer process
46+
function slackErrorHandler(err) {
47+
return mainWindow.webContents.send('slackError', err)
48+
}
49+
4650
function sendTokenRequest() {
4751
logEverywhere("inside sendTokenRequest");
4852

49-
const authData = {
50-
client_id: process.env.SLACK_CLIENT_ID,
51-
client_secret: process.env.SLACK_CLIENT_SECRET,
52-
code: authCode,
53-
redirect_uri: process.env.SLACK_REDIRECT_URI
54-
};
55-
logEverywhere(authData.code);
56-
57-
const url =
58-
"https://slack.com/api/openid.connect.token?" +
59-
"client_id=" +
60-
authData.client_id +
61-
"&client_secret=" +
62-
authData.client_secret +
63-
"&code=" +
64-
authData.code +
65-
"&grant_type=authorization_code" +
66-
"&redirect_uri=" +
67-
authData.redirect_uri;
68-
69-
logEverywhere(`Token Request URL: ${url}`);
70-
7153
// Send Post request for user information
7254
const request = net.request({
7355
method: "POST",
74-
url: url,
56+
url: 'https://slack.com/api/oauth.v2.access?' +
57+
"client_id=" +
58+
process.env.SLACK_CLIENT_ID +
59+
"&client_secret=" +
60+
process.env.SLACK_CLIENT_SECRET +
61+
"&code=" +
62+
authCode +
63+
"&grant_type=authorization_code" +
64+
"&redirect_uri=" +
65+
process.env.SLACK_REDIRECT_URI,
7566
headers: {
7667
"Content-Type": "application/x-www-form-urlencoded"
7768
}
@@ -84,22 +75,61 @@ function sendTokenRequest() {
8475
logEverywhere("Response ended ");
8576
});
8677
response.on("data", data => {
87-
// logEverywhere("response.on data ");
88-
// decodes utf8 Buffer into JSON, then parses it
8978
const decoded = JSON.parse(data.toString())
90-
91-
// decodes JSON Web Token and places decoded JWT back into response data
92-
decoded.id_token = jwt_decode(decoded.id_token)
93-
// logEverywhere(`decoded in response.on data: ${decoded}`)
94-
// send user information back to renderer process
79+
if (decoded.error) {
80+
return slackErrorHandler(decoded.error)
81+
}
82+
console.log('Is there an error? ', !!decoded.error, 'if true, this shouldnt be logging')
9583
mainWindow.webContents.send("tokenReceived", decoded);
84+
// getSlackUser(decoded.access_token, decoded.authed_user.id)
9685
});
9786
});
9887
request.end();
9988
}
10089

90+
function getSlackUser (token, userId) {
91+
const request = net.request({
92+
method: 'POST',
93+
url: 'https://slack.com/api/users.profile.get?' +
94+
"token=" + token +
95+
"&user=" + userId,
96+
headers: {
97+
'Content-Type': 'application/x-www-form-urlencoded'
98+
}
99+
})
100+
request.on('response', response => {
101+
response.on('end', () => {
102+
logEverywhere('User data recieved')
103+
})
104+
response.on('data', data => {
105+
const decoded = JSON.parse(data.toString());
106+
if (decoded.error) {
107+
return slackErrorHandler(decoded.error)
108+
}
109+
// logEverywhere('slackUser decoded data in getSlackUser' + decoded)
110+
mainWindow.webContents.send('slackUser', decoded)
111+
})
112+
})
113+
request.end()
114+
}
115+
116+
/*
117+
For Sign In with Slack, but we are now using the Add to Slack feature instead
118+
*/
119+
// function decodeUserToken (data) {
120+
// // logEverywhere("response.on data ");
121+
// // decodes utf8 Buffer into JSON, then parses it
122+
// const decoded = JSON.parse(data.toString())
123+
// // decodes JSON Web Token and places decoded JWT back into response data
124+
// decoded.id_token = jwt_decode(decoded.id_token)
125+
// // logEverywhere(`decoded in response.on data: ${decoded}`)
126+
// // send user information back to renderer process
127+
// return mainWindow.webContents.send("tokenReceived", decoded);
128+
// }
129+
101130
// Turns on event listener for Slack Oauth deep linking back app
102131
// TODO: Deep linking currently doesn't work properly in dev mode - requires fix
132+
103133
function setOauthListener() {
104134
logEverywhere(`process.env.SLACK_CLIENT_ID in electron-main: ${process.env.SLACK_CLIENT_ID}`);
105135
logEverywhere(`process.env.SLACK_CLIENT_SECRET in electron-main: ${process.env.SLACK_CLIENT_SECRET}`);

src/components/file_system_interface/SaveProjectComponent.vue

Lines changed: 10 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -114,14 +114,17 @@ export default {
114114
// })
115115
116116
// console.log('PROJECT SAVED AS A JSON OBJECT!')
117-
this.notifySlack()
117+
localforage.getItem('slackWebhookURL', (err, value) => {
118+
console.log('error: ', err)
119+
console.log('slackWebhookURL: ', value)
120+
if (value) this.notifySlack(fileName, value)
121+
})
118122
}
119123
},
120124
// creates a popup dialog box, where if you click on yes, it will send a message to our test Slack workspace
121-
// still must refactor to dynamically work with user's Slack
122-
notifySlack () {
123-
const slackWebhookURL = process.env.SLACK_WEBHOOK_URL
124-
console.log(slackWebhookURL)
125+
notifySlack (fileName, url) {
126+
// TODO: add feature to store slack user's name into local memory here if we decide to
127+
125128
remote.dialog.showMessageBox({
126129
title: 'Notify Slack?',
127130
message: 'Save successful. Would you like to notify your team on Slack?',
@@ -130,9 +133,9 @@ export default {
130133
},
131134
response => {
132135
if (response === 1) {
133-
fetch(slackWebhookURL, {
136+
fetch(url, {
134137
method: 'POST',
135-
body: JSON.stringify({ 'text': 'A team member saved an OverVue project file!' }),
138+
body: JSON.stringify({ 'text': `A team member has saved an OverVue project file: ${fileName}` }),
136139
headers: { 'Content-Type': 'application/json' }
137140
})
138141
}

src/components/slack_login/SlackLoginWindow.vue

Lines changed: 42 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -23,11 +23,13 @@
2323
<path d="M45.2 25.8c-7.1 0-12.9-5.8-12.9-12.9S38.1 0 45.2 0s12.9 5.8 12.9 12.9v12.9H45.2zm0 6.5c7.1 0 12.9 5.8 12.9 12.9s-5.8 12.9-12.9 12.9H12.9C5.8 58.1 0 52.3 0 45.2s5.8-12.9 12.9-12.9h32.3z" fill="#36c5f0"></path>
2424
<path d="M97 45.2c0-7.1 5.8-12.9 12.9-12.9s12.9 5.8 12.9 12.9-5.8 12.9-12.9 12.9H97V45.2zm-6.5 0c0 7.1-5.8 12.9-12.9 12.9s-12.9-5.8-12.9-12.9V12.9C64.7 5.8 70.5 0 77.6 0s12.9 5.8 12.9 12.9v32.3z" fill="#2eb67d"></path>
2525
<path d="M77.6 97c7.1 0 12.9 5.8 12.9 12.9s-5.8 12.9-12.9 12.9-12.9-5.8-12.9-12.9V97h12.9zm0-6.5c-7.1 0-12.9-5.8-12.9-12.9s5.8-12.9 12.9-12.9h32.3c7.1 0 12.9 5.8 12.9 12.9s-5.8 12.9-12.9 12.9H77.6z" fill="#ecb22e"></path>
26-
</svg>Sign in with Slack
26+
</svg>Connect to Slack
2727
</q-btn>
2828
<!--
2929
Skip button:
3030
-->
31+
<br/>
32+
<div style='color:red'>{{errorMessage}}</div>
3133
<br/>
3234
<q-btn @click="closeLogin()" class="skipBtn" >Skip</q-btn>
3335
</q-card>
@@ -46,32 +48,66 @@ export default {
4648
return {
4749
isAuthenticating: false,
4850
showLogin: true,
51+
errorMessage: ''
4952
}
5053
},
5154
created () {
5255
ipcRenderer.on('tokenReceived', (event, data) => {
5356
console.log('data in SlackLoginWindow: ', data)
57+
// localforage.setItem('slackWebhookURL', data.incoming_webhook.url)
58+
// .then(data => this.closeLogin())
59+
return this.saveToLocalForage('slackWebhookURL', data.incoming_webhook.url)
60+
})
61+
ipcRenderer.on('slackUser', (event, user) => {
62+
console.log('user received in SlackLoginWindow: ', user)
63+
// localforage.setItem('slackUser', user)
64+
// .then(data => this.closeLogin())
65+
// .catch(err => {
66+
// console.log('localforage caught an error when trying to set slackUser: ', err)
67+
// this.errorMessage = err
68+
// })
69+
return this.saveToLocalForage('slackUser', user)
70+
})
71+
ipcRenderer.on('slackError', (event, err) => {
72+
console.log('err received in SlackLoginWindow: ', err)
73+
this.printErrorMessage()
5474
})
5575
console.log(`process.env: ${process.env}`)
5676
},
5777
methods: {
5878
slackOauth: function () {
59-
const slackBaseUrl = 'https://slack.com/openid/connect/authorize'
60-
const responseType = 'code'
61-
const scope = 'openid profile'
62-
const clientId = process.env.SLACK_CLIENT_ID
79+
const slackBaseUrl = 'https://slack.com/oauth/v2/authorize'
80+
// const responseType = 'code'
81+
const scope = 'incoming-webhook'
6382
const redirectUri = process.env.SLACK_REDIRECT_URI
83+
const clientId = process.env.SLACK_CLIENT_ID
6484
6585
this.isAuthenticating = true;
6686
6787
console.log('clicked')
6888
shell.openExternal(
69-
`${slackBaseUrl}?response_type=${responseType}&scope=${scope}&client_id=${clientId}&redirect_uri=${redirectUri}`,
89+
// `${slackBaseUrl}?response_type=${responseType}&scope=${scope}&client_id=${clientId}&redirect_uri=${redirectUri}`,
90+
`${slackBaseUrl}?scope=${scope}&redirect_uri=${redirectUri}&client_id=${clientId}`,
7091
{ activate: true }
7192
)
7293
},
94+
saveToLocalForage: function (key, value) {
95+
localforage.setItem(key, value)
96+
this.closeLogin()
97+
// .catch(function (err) {
98+
// console.log('localforage caught an error when trying to set slackUser: ', err)
99+
// this.setErrorMessage(err)
100+
// })
101+
},
102+
printErrorMessage: function () {
103+
this.errorMessage = 'Failed to Connect to Slack'
104+
},
105+
setErrorMessage: function (err) {
106+
this.errorMessage = err
107+
},
73108
closeLogin: function () {
74109
this.showLogin = false
110+
this.errorMessage = ''
75111
},
76112
openLogin: function () {
77113
this.showLogin = true

0 commit comments

Comments
 (0)