他のウェブサイトから直接MisskeyAPIを利用できるように
This commit is contained in:
parent
c60b83f0dd
commit
6f2fde0304
2 changed files with 36 additions and 7 deletions
|
@ -26,9 +26,7 @@ app.use(bodyParser.json({
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}));
|
}));
|
||||||
app.use(cors({
|
app.use(cors());
|
||||||
origin: true
|
|
||||||
}));
|
|
||||||
|
|
||||||
app.get('/', (req, res) => {
|
app.get('/', (req, res) => {
|
||||||
res.send('YEE HAW');
|
res.send('YEE HAW');
|
||||||
|
|
|
@ -12,15 +12,31 @@ import config from '../../conf';
|
||||||
import signin from '../common/signin';
|
import signin from '../common/signin';
|
||||||
|
|
||||||
module.exports = (app: express.Application) => {
|
module.exports = (app: express.Application) => {
|
||||||
function getUserToken(req) {
|
function getUserToken(req: express.Request) {
|
||||||
// req.headers['cookie'] は常に string ですが、型定義の都合上
|
// req.headers['cookie'] は常に string ですが、型定義の都合上
|
||||||
// string | string[] になっているので string を明示しています
|
// string | string[] になっているので string を明示しています
|
||||||
return ((req.headers['cookie'] as string || '').match(/i=(!\w+)/) || [null, null])[1];
|
return ((req.headers['cookie'] as string || '').match(/i=(!\w+)/) || [null, null])[1];
|
||||||
}
|
}
|
||||||
|
|
||||||
app.get('/disconnect/twitter', async (req, res): Promise<any> => {
|
function compareOrigin(req: express.Request) {
|
||||||
const userToken = getUserToken(req);
|
function normalizeUrl(url: string) {
|
||||||
|
return url[url.length - 1] === '/' ? url.substr(0, url.length - 1) : url;
|
||||||
|
}
|
||||||
|
|
||||||
|
// req.headers['cookie'] は常に string ですが、型定義の都合上
|
||||||
|
// string | string[] になっているので string を明示しています
|
||||||
|
const referer = req.headers['referer'] as string;
|
||||||
|
|
||||||
|
return (normalizeUrl(referer) == normalizeUrl(config.url));
|
||||||
|
}
|
||||||
|
|
||||||
|
app.get('/disconnect/twitter', async (req, res): Promise<any> => {
|
||||||
|
if (!compareOrigin(req)) {
|
||||||
|
res.status(400).send('invalid origin');
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
const userToken = getUserToken(req);
|
||||||
if (userToken == null) return res.send('plz signin');
|
if (userToken == null) return res.send('plz signin');
|
||||||
|
|
||||||
const user = await User.findOneAndUpdate({
|
const user = await User.findOneAndUpdate({
|
||||||
|
@ -59,8 +75,14 @@ module.exports = (app: express.Application) => {
|
||||||
});
|
});
|
||||||
|
|
||||||
app.get('/connect/twitter', async (req, res): Promise<any> => {
|
app.get('/connect/twitter', async (req, res): Promise<any> => {
|
||||||
|
if (!compareOrigin(req)) {
|
||||||
|
res.status(400).send('invalid origin');
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
const userToken = getUserToken(req);
|
const userToken = getUserToken(req);
|
||||||
if (userToken == null) return res.send('plz signin');
|
if (userToken == null) return res.send('plz signin');
|
||||||
|
|
||||||
const ctx = await twAuth.begin();
|
const ctx = await twAuth.begin();
|
||||||
redis.set(userToken, JSON.stringify(ctx));
|
redis.set(userToken, JSON.stringify(ctx));
|
||||||
res.redirect(ctx.url);
|
res.redirect(ctx.url);
|
||||||
|
@ -98,6 +120,7 @@ module.exports = (app: express.Application) => {
|
||||||
|
|
||||||
if (sessid == undefined) {
|
if (sessid == undefined) {
|
||||||
res.status(400).send('invalid session');
|
res.status(400).send('invalid session');
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
redis.get(sessid, async (_, ctx) => {
|
redis.get(sessid, async (_, ctx) => {
|
||||||
|
@ -109,13 +132,21 @@ module.exports = (app: express.Application) => {
|
||||||
|
|
||||||
if (user == null) {
|
if (user == null) {
|
||||||
res.status(404).send(`@${result.screenName}と連携しているMisskeyアカウントはありませんでした...`);
|
res.status(404).send(`@${result.screenName}と連携しているMisskeyアカウントはありませんでした...`);
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
signin(res, user, true);
|
signin(res, user, true);
|
||||||
});
|
});
|
||||||
} else {
|
} else {
|
||||||
|
const verifier = req.query.oauth_verifier;
|
||||||
|
|
||||||
|
if (verifier == null) {
|
||||||
|
res.status(400).send('invalid session');
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
redis.get(userToken, async (_, ctx) => {
|
redis.get(userToken, async (_, ctx) => {
|
||||||
const result = await twAuth.done(JSON.parse(ctx), req.query.oauth_verifier);
|
const result = await twAuth.done(JSON.parse(ctx), verifier);
|
||||||
|
|
||||||
const user = await User.findOneAndUpdate({
|
const user = await User.findOneAndUpdate({
|
||||||
token: userToken
|
token: userToken
|
||||||
|
|
Loading…
Reference in a new issue