diff options
| author | Akihiko Odaki <nekomanma@pixiv.co.jp> | 2018-03-29 01:20:40 +0900 |
|---|---|---|
| committer | Akihiko Odaki <nekomanma@pixiv.co.jp> | 2018-03-29 01:54:41 +0900 |
| commit | 90f8fe7e538bb7e52d2558152a0390e693f39b11 (patch) | |
| tree | 0f830887053c8f352b1cd0c13ca715fd14c1f030 /src/server/api/authenticate.ts | |
| parent | Implement remote account resolution (diff) | |
| download | sharkey-90f8fe7e538bb7e52d2558152a0390e693f39b11.tar.gz sharkey-90f8fe7e538bb7e52d2558152a0390e693f39b11.tar.bz2 sharkey-90f8fe7e538bb7e52d2558152a0390e693f39b11.zip | |
Introduce processor
Diffstat (limited to 'src/server/api/authenticate.ts')
| -rw-r--r-- | src/server/api/authenticate.ts | 69 |
1 files changed, 69 insertions, 0 deletions
diff --git a/src/server/api/authenticate.ts b/src/server/api/authenticate.ts new file mode 100644 index 0000000000..537c3d1e1f --- /dev/null +++ b/src/server/api/authenticate.ts @@ -0,0 +1,69 @@ +import * as express from 'express'; +import App from './models/app'; +import { default as User, IUser } from './models/user'; +import AccessToken from './models/access-token'; +import isNativeToken from './common/is-native-token'; + +export interface IAuthContext { + /** + * App which requested + */ + app: any; + + /** + * Authenticated user + */ + user: IUser; + + /** + * Whether requested with a User-Native Token + */ + isSecure: boolean; +} + +export default (req: express.Request) => new Promise<IAuthContext>(async (resolve, reject) => { + const token = req.body['i'] as string; + + if (token == null) { + return resolve({ + app: null, + user: null, + isSecure: false + }); + } + + if (isNativeToken(token)) { + const user: IUser = await User + .findOne({ 'account.token': token }); + + if (user === null) { + return reject('user not found'); + } + + return resolve({ + app: null, + user: user, + isSecure: true + }); + } else { + const accessToken = await AccessToken.findOne({ + hash: token.toLowerCase() + }); + + if (accessToken === null) { + return reject('invalid signature'); + } + + const app = await App + .findOne({ _id: accessToken.app_id }); + + const user = await User + .findOne({ _id: accessToken.user_id }); + + return resolve({ + app: app, + user: user, + isSecure: false + }); + } +}); |