summaryrefslogtreecommitdiff
path: root/src/server/api/authenticate.ts
diff options
context:
space:
mode:
authorAkihiko Odaki <nekomanma@pixiv.co.jp>2018-03-29 01:20:40 +0900
committerAkihiko Odaki <nekomanma@pixiv.co.jp>2018-03-29 01:54:41 +0900
commit90f8fe7e538bb7e52d2558152a0390e693f39b11 (patch)
tree0f830887053c8f352b1cd0c13ca715fd14c1f030 /src/server/api/authenticate.ts
parentImplement remote account resolution (diff)
downloadsharkey-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.ts69
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
+ });
+ }
+});