-
Notifications
You must be signed in to change notification settings - Fork 3
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
feat: support github oauth and opensumi run (#15)
- Loading branch information
Showing
7 changed files
with
178 additions
and
1 deletion.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,60 @@ | ||
import { GitHubKVManager } from '@/kv/github'; | ||
|
||
export function route(hono: THono) { | ||
hono.get('/auth/callback/:id', async (c) => { | ||
const code = c.req.query('code'); | ||
const state = c.req.query('state'); | ||
const config = await GitHubKVManager.instance().getOauthAppConfig( | ||
c.req.param('id'), | ||
); | ||
|
||
if (!config) { | ||
return c.html('error', 500); | ||
} | ||
|
||
const res = await fetch('https://github.com/login/oauth/access_token', { | ||
method: 'POST', | ||
headers: { | ||
Accept: 'application/json', | ||
'Content-Type': 'application/json', | ||
}, | ||
body: JSON.stringify({ | ||
client_id: config.clientId, | ||
client_secret: config.clientSecret, | ||
code, | ||
}), | ||
}) | ||
.then((res) => res.json<{ access_token: string }>()) | ||
.catch((err) => { | ||
console.log('request github error: ', err); | ||
}); | ||
|
||
if (res && state) { | ||
const [, originalUrl] = state.split('|'); | ||
// 获取 state 参数,重定向到原始页面 | ||
// 携带 access_token 参数,前端自行缓存后请求 | ||
return c.redirect(`${originalUrl}?access_token=${res.access_token}`); | ||
} | ||
|
||
return c.html('error', 500); | ||
}); | ||
|
||
hono.get('/auth/github/:id', async (c) => { | ||
const config = await GitHubKVManager.instance().getOauthAppConfig( | ||
c.req.param('id'), | ||
); | ||
|
||
if (!config) { | ||
return c.html('error', 500); | ||
} | ||
|
||
// 重定向到 github 登录页面 | ||
// 透传 state 参数,用于登录后重定向到原始页面 | ||
// state: originalState|originalUrl | ||
return c.redirect( | ||
`https://github.com/login/oauth/authorize?client_id=${ | ||
config.clientId | ||
}&scope=read:user%20repo&state=${c.req.query('state')}`, | ||
); | ||
}); | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,45 @@ | ||
import { html } from 'hono/html'; | ||
|
||
import Environment from '@/env'; | ||
import { OpenSumiRunKVManager } from '@/kv/run'; | ||
|
||
export function route(hono: THono) { | ||
hono.get('/ide/:group/:project', async (c) => { | ||
const env = Environment.instance().environment; | ||
const version = await OpenSumiRunKVManager.instance().getCdnVersion(); | ||
const originTrial = await OpenSumiRunKVManager.instance().getTrialToken( | ||
env, | ||
); | ||
|
||
const cdnBase = | ||
env === 'prod' | ||
? 'https://g.alicdn.com/opensumi/run' | ||
: 'https://dev.g.alicdn.com/opensumi/run'; | ||
|
||
return c.html( | ||
html`<!DOCTYPE html> | ||
<html> | ||
<head> | ||
<meta charset="UTF-8" /> | ||
<title>OpenSumi</title> | ||
<link | ||
rel="icon" | ||
href="https://opensumi.com/favicon-32x32.png?v=844070368776e5e9503bdeccf498ee66" | ||
/> | ||
<script src="https://g.alicdn.com/code/lib/??react/16.14.0/umd/react.production.min.js,react-dom/16.14.0/umd/react-dom.production.min.js"></script> | ||
<link rel="stylesheet" href="${cdnBase}/${version}/main.css " /> | ||
</head> | ||
<body> | ||
<script> | ||
const otMeta = document.createElement('meta'); | ||
otMeta.httpEquiv = 'origin-trial'; | ||
otMeta.content = '${originTrial}'; | ||
document.head.append(otMeta); | ||
</script> | ||
<div id="main"></div> | ||
<script src="${cdnBase}/${version}/bundle.js"></script> | ||
</body> | ||
</html>`, | ||
); | ||
}); | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,37 @@ | ||
import { KVManager, OpenSumiRunCommon } from '@/kv'; | ||
|
||
import { IOpenSumiRunConfig, IOpenSumiRunOriginalTrialToken } from './types'; | ||
|
||
export class OpenSumiRunKVManager { | ||
cdnVersion: KVManager<IOpenSumiRunConfig>; | ||
|
||
originalTrialToken: KVManager<IOpenSumiRunOriginalTrialToken>; | ||
|
||
constructor() { | ||
this.cdnVersion = KVManager.for<IOpenSumiRunConfig>( | ||
OpenSumiRunCommon.OPENSUMI_RUN_CDN_VERSION_PREFIX, | ||
); | ||
|
||
this.originalTrialToken = KVManager.for<IOpenSumiRunOriginalTrialToken>( | ||
OpenSumiRunCommon.OPENSUMI_RUN_ORIGINAL_TRIAL_TOKEN_PREFIX, | ||
); | ||
} | ||
|
||
private static _instance: OpenSumiRunKVManager; | ||
static instance() { | ||
if (!this._instance) { | ||
this._instance = new OpenSumiRunKVManager(); | ||
} | ||
return this._instance; | ||
} | ||
|
||
getCdnVersion = async () => { | ||
const cdnVersionData = await this.cdnVersion.getJSON(''); | ||
return cdnVersionData?.version || '0.0.1'; | ||
}; | ||
|
||
getTrialToken = async (env: 'local' | 'prod' | 'unittest') => { | ||
const trialTokenData = await this.originalTrialToken.getJSON(''); | ||
return trialTokenData ? trialTokenData[env] : undefined; | ||
}; | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters