This commit is contained in:
parent
cfedf1d0f6
commit
41f37d09e6
1 changed files with 48 additions and 55 deletions
|
@ -49,12 +49,6 @@ module.exports = (app: express.Application) => {
|
|||
callbackUrl: `${config.api_url}/tw/cb`
|
||||
});
|
||||
|
||||
const twAuthSignin = autwh({
|
||||
consumerKey: config.twitter.consumer_key,
|
||||
consumerSecret: config.twitter.consumer_secret,
|
||||
callbackUrl: `${config.api_url}/signin/twitter/cb`
|
||||
});
|
||||
|
||||
app.get('/connect/twitter', async (req, res): Promise<any> => {
|
||||
if (res.locals.user == null) return res.send('plz signin');
|
||||
const ctx = await twAuth.begin();
|
||||
|
@ -62,8 +56,52 @@ module.exports = (app: express.Application) => {
|
|||
res.redirect(ctx.url);
|
||||
});
|
||||
|
||||
app.get('/signin/twitter', async (req, res): Promise<any> => {
|
||||
const ctx = await twAuth.begin();
|
||||
|
||||
const sessid = uuid();
|
||||
|
||||
redis.set(sessid, JSON.stringify(ctx));
|
||||
|
||||
const expires = 1000 * 60 * 60; // 1h
|
||||
res.cookie('signin_with_twitter_session_id', sessid, {
|
||||
path: '/',
|
||||
domain: `.${config.host}`,
|
||||
secure: config.url.substr(0, 5) === 'https',
|
||||
httpOnly: true,
|
||||
expires: new Date(Date.now() + expires),
|
||||
maxAge: expires
|
||||
});
|
||||
|
||||
res.redirect(ctx.url);
|
||||
});
|
||||
|
||||
app.get('/tw/cb', (req, res): any => {
|
||||
if (res.locals.user == null) return res.send('plz signin');
|
||||
if (res.locals.user == null) {
|
||||
// req.headers['cookie'] は常に string ですが、型定義の都合上
|
||||
// string | string[] になっているので string を明示しています
|
||||
const cookies = cookie.parse((req.headers['cookie'] as string || ''));
|
||||
|
||||
const sessid = cookies['signin_with_twitter_session_id'];
|
||||
|
||||
if (sessid == undefined) {
|
||||
res.status(400).send('invalid session');
|
||||
}
|
||||
|
||||
redis.get(sessid, async (_, ctx) => {
|
||||
const result = await twAuth.done(JSON.parse(ctx), req.query.oauth_verifier);
|
||||
|
||||
const user = await User.findOne({
|
||||
'twitter.user_id': result.userId
|
||||
});
|
||||
|
||||
if (user == null) {
|
||||
res.status(404).send(`@${result.screenName}と連携しているMisskeyアカウントはありませんでした...`);
|
||||
}
|
||||
|
||||
signin(res, user, true);
|
||||
});
|
||||
} else {
|
||||
redis.get(res.locals.user, async (_, ctx) => {
|
||||
const result = await twAuth.done(JSON.parse(ctx), req.query.oauth_verifier);
|
||||
|
||||
|
@ -88,51 +126,6 @@ module.exports = (app: express.Application) => {
|
|||
includeSecrets: true
|
||||
}));
|
||||
});
|
||||
});
|
||||
|
||||
app.get('/signin/twitter', async (req, res): Promise<any> => {
|
||||
const ctx = await twAuthSignin.begin();
|
||||
|
||||
const sessid = uuid();
|
||||
|
||||
redis.set(sessid, JSON.stringify(ctx));
|
||||
|
||||
const expires = 1000 * 60 * 60; // 1h
|
||||
res.cookie('signin_with_twitter_session_id', sessid, {
|
||||
path: '/',
|
||||
domain: `.${config.host}`,
|
||||
secure: config.url.substr(0, 5) === 'https',
|
||||
httpOnly: true,
|
||||
expires: new Date(Date.now() + expires),
|
||||
maxAge: expires
|
||||
});
|
||||
|
||||
res.redirect(ctx.url);
|
||||
});
|
||||
|
||||
app.get('/signin/twitter/cb', (req, res): any => {
|
||||
// req.headers['cookie'] は常に string ですが、型定義の都合上
|
||||
// string | string[] になっているので string を明示しています
|
||||
const cookies = cookie.parse((req.headers['cookie'] as string || ''));
|
||||
|
||||
const sessid = cookies['signin_with_twitter_session_id'];
|
||||
|
||||
if (sessid == undefined) {
|
||||
res.status(400).send('invalid session');
|
||||
}
|
||||
|
||||
redis.get(sessid, async (_, ctx) => {
|
||||
const result = await twAuthSignin.done(JSON.parse(ctx), req.query.oauth_verifier);
|
||||
|
||||
const user = await User.findOne({
|
||||
'twitter.user_id': result.userId
|
||||
});
|
||||
|
||||
if (user == null) {
|
||||
res.status(404).send(`@${result.screenName}と連携しているMisskeyアカウントはありませんでした...`);
|
||||
}
|
||||
|
||||
signin(res, user, true);
|
||||
});
|
||||
});
|
||||
};
|
||||
|
|
Loading…
Reference in a new issue