mirror of https://github.com/msgbyte/tailchat
You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
86 lines
2.1 KiB
TypeScript
86 lines
2.1 KiB
TypeScript
import express from 'express';
|
|
import path from 'path';
|
|
import axios from 'axios';
|
|
import fs from 'fs-extra';
|
|
const app = express();
|
|
const port = 8080;
|
|
|
|
const API = process.env.API || 'http://localhost:11001';
|
|
const clientUrl = `http://localhost:${port}`;
|
|
const clientId = process.env.ID || 'tc_61f5270008e0635f67868f01';
|
|
const clientSecret = process.env.SECRET || 'PDnLVsNnFyqWRS0QXYeaHDlE8KwgQLqv';
|
|
|
|
console.log('config:', {
|
|
API,
|
|
clientUrl,
|
|
clientId,
|
|
});
|
|
|
|
const request = axios.create({
|
|
baseURL: API,
|
|
transformRequest: [
|
|
function (data) {
|
|
let ret = '';
|
|
for (const it in data) {
|
|
ret +=
|
|
encodeURIComponent(it) + '=' + encodeURIComponent(data[it]) + '&';
|
|
}
|
|
ret = ret.substring(0, ret.lastIndexOf('&'));
|
|
return ret;
|
|
},
|
|
],
|
|
headers: {
|
|
'content-type': 'application/x-www-form-urlencoded',
|
|
},
|
|
});
|
|
|
|
app.get('/', async (req, res) => {
|
|
let html = (
|
|
await fs.readFile(path.resolve(__dirname, './app.html'))
|
|
).toString();
|
|
html = html
|
|
.replace('<API>', API)
|
|
.replace('<clientId>', clientId)
|
|
.replace('<clientUrl>', clientUrl);
|
|
|
|
res.send(html);
|
|
});
|
|
|
|
app.get('/cb', async (req, res, next) => {
|
|
try {
|
|
const { code, state } = req.query;
|
|
|
|
console.log('code', code);
|
|
|
|
// 根据获取到的code获取授权码
|
|
const { data: tokenInfo } = await request.post('/open/token', {
|
|
// client_id: 'foo',
|
|
client_id: clientId,
|
|
client_secret: clientSecret,
|
|
redirect_uri: `${clientUrl}/cb`,
|
|
code,
|
|
grant_type: 'authorization_code',
|
|
});
|
|
|
|
console.log('tokenInfo', tokenInfo);
|
|
|
|
const { access_token, expires_in, id_token, scope, token_type } = tokenInfo;
|
|
|
|
console.log('access_token', access_token);
|
|
|
|
const { data: userInfo } = await request.post('/open/me', {
|
|
access_token,
|
|
});
|
|
|
|
res.json({ userInfo });
|
|
} catch (err) {
|
|
console.error(err.response.data);
|
|
next(err);
|
|
}
|
|
});
|
|
|
|
app.listen(port, () => {
|
|
console.log(`请确保回调已经被注册在OIDC服务端的白名单中: ${clientUrl}/cb`);
|
|
console.log(`测试服务地址: http://127.0.0.1:${port}`);
|
|
});
|