Files
misskey/src/server/api/authenticate.ts
T

57 lines
1.3 KiB
TypeScript
Raw Normal View History

2017-01-06 11:07:42 +09:00
import isNativeToken from './common/is-native-token';
2019-04-07 21:50:36 +09:00
import { User } from '../../models/entities/user';
import { Users, AccessTokens, Apps } from '../../models';
2020-03-28 11:24:37 +09:00
import { ensure } from '../../prelude/ensure';
2020-03-28 18:07:41 +09:00
import { AccessToken } from '../../models/entities/access-token';
2020-03-28 11:24:37 +09:00
2020-03-28 18:07:41 +09:00
export default async (token: string): Promise<[User | null | undefined, AccessToken | null | undefined]> => {
2017-01-06 01:28:16 +09:00
if (token == null) {
2019-01-23 19:25:36 +09:00
return [null, null];
2017-01-06 01:28:16 +09:00
}
2017-01-06 11:07:42 +09:00
if (isNativeToken(token)) {
// Fetch user
2019-04-07 21:50:36 +09:00
const user = await Users
.findOne({ token });
2016-12-29 07:49:51 +09:00
2019-04-07 21:50:36 +09:00
if (user == null) {
2019-04-14 04:17:24 +09:00
throw new Error('user not found');
2016-12-29 07:49:51 +09:00
}
2019-01-23 19:25:36 +09:00
return [user, null];
2017-01-06 01:28:16 +09:00
} else {
2019-04-07 21:50:36 +09:00
const accessToken = await AccessTokens.findOne({
2020-06-03 13:19:07 +09:00
where: [{
hash: token.toLowerCase() // app
}, {
token: token // miauth
}],
2016-12-29 07:49:51 +09:00
});
2019-04-07 21:50:36 +09:00
if (accessToken == null) {
2019-04-14 04:17:24 +09:00
throw new Error('invalid signature');
2016-12-29 07:49:51 +09:00
}
2020-03-28 11:24:37 +09:00
AccessTokens.update(accessToken.id, {
lastUsedAt: new Date(),
});
2016-12-29 07:49:51 +09:00
2019-04-07 21:50:36 +09:00
const user = await Users
2019-04-16 01:20:28 +09:00
.findOne({
id: accessToken.userId // findOne(accessToken.userId) のように書かないのは後方互換性のため
});
2016-12-29 07:49:51 +09:00
2020-03-28 11:24:37 +09:00
if (accessToken.appId) {
const app = await Apps
.findOne(accessToken.appId).then(ensure);
return [user, {
2020-03-28 18:07:41 +09:00
id: accessToken.id,
2020-03-28 11:24:37 +09:00
permission: app.permission
2020-03-28 18:07:41 +09:00
} as AccessToken];
2020-03-28 11:24:37 +09:00
} else {
2020-03-28 18:07:41 +09:00
return [user, accessToken];
2020-03-28 11:24:37 +09:00
}
2016-12-29 07:49:51 +09:00
}
2019-01-23 19:25:36 +09:00
};