summaryrefslogtreecommitdiff
path: root/src/api/endpoints/auth/session/userkey.ts
blob: fdb8c26d4eae81efd48df1c4af41e89f072fc8c9 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
'use strict';

/**
 * Module dependencies
 */
import it from '../../../it';
import App from '../../../models/app';
import AuthSess from '../../../models/auth-session';
import AccessToken from '../../../models/access-token';
import serialize from '../../../serializers/user';

/**
 * @swagger
 * /auth/session/userkey:
 *   post:
 *     summary: Get an access token(userkey)
 *     parameters:
 *       -
 *         name: app_secret
 *         description: App Secret
 *         in: formData
 *         required: true
 *         type: string
 *       -
 *         name: token
 *         description: Session Token
 *         in: formData
 *         required: true
 *         type: string
 *
 *     responses:
 *       200:
 *         description: OK
 *         schema:
 *           type: object
 *           properties:
 *             userkey:
 *               type: string
 *               description: Access Token
 *             user:
 *               $ref: "#/definitions/User"
 *       default:
 *         description: Failed
 *         schema:
 *           $ref: "#/definitions/Error"
 */

/**
 * Generate a session
 *
 * @param {any} params
 * @return {Promise<any>}
 */
module.exports = (params) =>
	new Promise(async (res, rej) => {
		// Get 'app_secret' parameter
		const [appSecret, appSecretErr] = it(params.app_secret).expect.string().required().qed();
		if (appSecretErr) return rej('invalid app_secret param');

		// Lookup app
		const app = await App.findOne({
			secret: appSecret
		});

		if (app == null) {
			return rej('app not found');
		}

		// Get 'token' parameter
		const [token, tokenErr] = it(params.token).expect.string().required().qed();
		if (tokenErr) return rej('invalid token param');

		// Fetch token
		const session = await AuthSess
			.findOne({
				token: token,
				app_id: app._id
			});

		if (session === null) {
			return rej('session not found');
		}

		if (session.user_id == null) {
			return rej('this session is not allowed yet');
		}

		// Lookup access token
		const accessToken = await AccessToken.findOne({
			app_id: app._id,
			user_id: session.user_id
		});

		// Delete session

		/* https://github.com/Automattic/monk/issues/178
		AuthSess.deleteOne({
			_id: session._id
		});
		*/
		AuthSess.remove({
			_id: session._id
		});

		// Response
		res({
			access_token: accessToken.token,
			user: await serialize(session.user_id, null, {
				detail: true
			})
		});
	});