From 11c0d9c4310ed7ad23ade1acb8a550562f212453 Mon Sep 17 00:00:00 2001 From: Leon Date: Wed, 31 Mar 2021 15:00:31 +0800 Subject: [PATCH] feat: add bsn auth --- packages/auth/config.json | 3 ++- packages/auth/src/Auth.js | 6 +++--- packages/auth/src/providers/bsn.js | 23 +++++++++++++++++++++++ 3 files changed, 28 insertions(+), 4 deletions(-) create mode 100644 packages/auth/src/providers/bsn.js diff --git a/packages/auth/config.json b/packages/auth/config.json index 782d501a..69cb7825 100644 --- a/packages/auth/config.json +++ b/packages/auth/config.json @@ -3,5 +3,6 @@ "AWSRoleSessionName": "webide", "AWSRegion": "cn-north-1", "GithubClientId": "0719e502c798dd4bb376", - "TencentClientId": "100017401279" + "TencentClientId": "100017401279", + "BSNClientId": "" } \ No newline at end of file diff --git a/packages/auth/src/Auth.js b/packages/auth/src/Auth.js index 67df3ad2..e79a37fc 100644 --- a/packages/auth/src/Auth.js +++ b/packages/auth/src/Auth.js @@ -27,21 +27,21 @@ export default { return !!this.username }, - async login (history, provider = 'github') { + async login (history, provider = 'github', state) { if (!providers[provider]) { return } if (platform.isDesktop) { const channel = new IpcChannel('auth') const loginUrl = providers[provider].loginUrl - const callbackUrl = await channel.invoke('login', { loginUrl, serverUrl }) + const callbackUrl = await channel.invoke('login', { loginUrl, serverUrl, state }) if (callbackUrl) { await this.handleCallback({ location: new URL(callbackUrl), provider, history }) } this.updateProfile() await channel.invoke('close') } else { - providers[provider].login() + providers[provider].login(state) } }, diff --git a/packages/auth/src/providers/bsn.js b/packages/auth/src/providers/bsn.js new file mode 100644 index 00000000..bdf9aa46 --- /dev/null +++ b/packages/auth/src/providers/bsn.js @@ -0,0 +1,23 @@ +import { BSNClientId } from '../../config.json' + +const project = process.env.PROJECT +const serverUrl = process.env.REACT_APP_SERVER_URL +const clientId = process.env.REACT_APP_BSN_CLIENT_ID || BSNClientId +const redirectUri = `${serverUrl}/api/v1/auth/callback/${project}/bsn` + +export default { + login (state) { + window.location.href = `${this.loginUrl}&state=${this.formatState(state)}` + }, + formatState (state) { + const stateString = JSON.stringify(state) + return encodeURIComponent(btoa(stateString)) + }, + restoreState (raw) { + const stateString = atob(decodeURIComponent(raw)) + return JSON.parse(stateString) + }, + get loginUrl() { + return `https://bsn.com/oauth/authorize?response_type=code&client_id=${clientId}&scope=all&redirect_uri=${redirectUri}` + } +}