@steedos/auth 2.2.51-beta.1 → 2.2.51-beta.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@steedos/auth",
3
3
  "private": false,
4
- "version": "2.2.51-beta.1",
4
+ "version": "2.2.51-beta.2",
5
5
  "main": "lib/index.js",
6
6
  "scripts": {
7
7
  "watch": "tsc --watch",
@@ -14,7 +14,7 @@
14
14
  "access": "public"
15
15
  },
16
16
  "dependencies": {
17
- "@steedos/objectql": "2.2.51-beta.1",
17
+ "@steedos/objectql": "2.2.51-beta.2",
18
18
  "cookies": "^0.7.3",
19
19
  "express": "^4.16.4",
20
20
  "jsonwebtoken": "^8.5.1",
@@ -32,5 +32,5 @@
32
32
  "ts-node": "^8.0.3",
33
33
  "typescript": "3.5.3"
34
34
  },
35
- "gitHead": "edeb1c70d34159e3caac697f9e207c2ca98d8d00"
35
+ "gitHead": "c324c40fa8facd3bf73a51e8c417293a9349f9fb"
36
36
  }
package/lib/apikey.d.ts DELETED
@@ -1,9 +0,0 @@
1
- export declare function isAPIKey(token: any): any;
2
- export declare function verifyAPIKey(token: any): Promise<{
3
- userId: any;
4
- spaceId: any;
5
- }>;
6
- export declare function getAPIKey(spaceId: any): Promise<any>;
7
- export declare function getAPIKeyAuthHeader(spaceId: any): Promise<{
8
- Authorization: string;
9
- }>;
@@ -1,7 +0,0 @@
1
- import { Response } from 'express';
2
- import * as core from "express-serve-static-core";
3
- interface Request extends core.Request {
4
- user: any;
5
- }
6
- export declare const requireAuthentication: (req: Request, res: Response, next: () => void) => Promise<void>;
7
- export {};
@@ -1 +0,0 @@
1
- export declare const jwtSSO: (req: any, res: any) => Promise<void>;
@@ -1,2 +0,0 @@
1
- import * as express from 'express';
2
- export declare const login: (req: express.Request, res: express.Response) => Promise<express.Response<any, Record<string, any>>>;
@@ -1,2 +0,0 @@
1
- import * as express from 'express';
2
- export declare const logout: (req: express.Request, res: express.Response) => Promise<express.Response<any, Record<string, any>>>;
@@ -1,2 +0,0 @@
1
- import * as express from 'express';
2
- export declare const validate: (req: express.Request, res: express.Response) => Promise<express.Response<any, Record<string, any>>>;
@@ -1 +0,0 @@
1
- export declare const authExpress: any;
package/lib/index.d.ts DELETED
@@ -1,8 +0,0 @@
1
- export { getSession, auth, setRequestUser, getSessionByUserId, getSessionByUserIdSync, removeUserSessionsCacheByUserId } from "./session";
2
- export * from "./utils";
3
- export * from "./tokenMap";
4
- export * from './userSession';
5
- export * from './spaceUserSession';
6
- export { authExpress } from "./express-middleware";
7
- export { getAPIKeyAuthHeader } from './apikey';
8
- export { requireAuthentication } from './auth-middleware';
package/lib/session.d.ts DELETED
@@ -1,18 +0,0 @@
1
- import { SteedosUserSession } from '@steedos/objectql';
2
- import { Response } from "express";
3
- import * as core from "express-serve-static-core";
4
- interface Request extends core.Request {
5
- user?: any;
6
- }
7
- export declare function getSessionByUserId(userId: any, spaceId?: any): Promise<SteedosUserSession>;
8
- export declare function getSessionByUserIdSync(userId: any, spaceId?: any): any;
9
- export declare function getSession(token: string, spaceId?: string, clientInfos?: any): Promise<SteedosUserSession>;
10
- export declare function getUserAgent(req: any): string;
11
- export declare function getLoginDevice(userAgent: any): {
12
- is_phone: boolean;
13
- is_tablet: boolean;
14
- };
15
- export declare function auth(request: Request, response: Response): Promise<any>;
16
- export declare function setRequestUser(request: Request, response: Response, next: () => void): Promise<void>;
17
- export declare function removeUserSessionsCacheByUserId(userId: any, is_phone: any): void;
18
- export {};
@@ -1,4 +0,0 @@
1
- export declare function getSpaceSessionFromCache(spaceId: any, userId: any): any;
2
- export declare function addSpaceSessionToCache(spaceId: any, userId: any, spaceUserSession: any): void;
3
- export declare function getSpaceUserSession(spaceId: any, userId: any): Promise<any>;
4
- export declare function updateSpaceUserSessionRolesCache(spaceId: any, userId: any): Promise<boolean>;
package/lib/tokenMap.d.ts DELETED
@@ -1,2 +0,0 @@
1
- export declare function getUserIdByToken(token: any, clientInfos?: {}): Promise<any>;
2
- export declare function removeUserTokens(userId: any, is_phone: any): void;
@@ -1,3 +0,0 @@
1
- export declare function getSessionFromCache(userId: any): any;
2
- export declare function addSessionToCache(userId: any, userSession: any): void;
3
- export declare function getUserSession(userId: any): Promise<any>;
@@ -1,12 +0,0 @@
1
- export declare const hashLoginToken: (loginToken: any) => string;
2
- export declare const generateStampedLoginToken: () => {
3
- token: any;
4
- when: Date;
5
- };
6
- export declare const hashStampedToken: (stampedToken: any) => {
7
- hashedToken: string;
8
- };
9
- export declare const insertHashedLoginToken: (userId: any, hashedToken: any) => Promise<any>;
10
- export declare const setAuthCookies: (req: any, res: any, userId: any, authToken: any, spaceId?: any) => void;
11
- export declare const clearAuthCookies: (req: any, res: any) => void;
12
- export declare function isExpried(expiredAt: number): boolean;
@@ -1,2 +0,0 @@
1
- declare let Random: any;
2
- export default Random;
package/src/apikey.ts DELETED
@@ -1,36 +0,0 @@
1
- import { getObject, SteedosError } from '@steedos/objectql';
2
-
3
- const HEADER_AUTH = 'Authorization';
4
- const AUTH_TYPE = 'Bearer';
5
-
6
- export function isAPIKey(token) {
7
- return token.startsWith('apikey,')
8
- }
9
-
10
- export async function verifyAPIKey(token) {
11
- if (isAPIKey(token)) {
12
- const apikey = token.replace('apikey,', '');
13
- const records = await getObject('api_keys').find({ filters: [['api_key', '=', apikey], ['active', '=', true]] });
14
- if (records.length > 0) {
15
- const record = records[0];
16
- await getObject('api_keys').update(record._id, { last_use_time: new Date() });
17
- return { userId: record.owner, spaceId: record.space };
18
- }
19
- }
20
- }
21
-
22
- export async function getAPIKey(spaceId) {
23
- const space = await getObject('spaces').findOne(spaceId, {});
24
- if (space) {
25
- return space.api_key;
26
- }
27
- }
28
-
29
- export async function getAPIKeyAuthHeader(spaceId) {
30
- const api_key = await getAPIKey(spaceId);
31
- if (!api_key) {
32
- throw new SteedosError('space_apikey_notfind');
33
- }else{
34
- return {[HEADER_AUTH]: `${AUTH_TYPE} apikey,${api_key}`};
35
- }
36
- }
@@ -1,18 +0,0 @@
1
- import { setRequestUser } from "./session";
2
- import { Response } from 'express';
3
- import * as core from "express-serve-static-core";
4
- interface Request extends core.Request {
5
- user: any;
6
- }
7
-
8
- export const requireAuthentication = async (req: Request, res: Response, next: () => void) => {
9
- await setRequestUser(req, res, function () {
10
- if (req.user) {
11
- next();
12
- }
13
- else {
14
- res.status(401).send({ status: 'error', message: 'You must be logged in to do this.' });
15
- }
16
- });
17
-
18
- }
package/src/creator.d.ts DELETED
@@ -1,7 +0,0 @@
1
- declare var Meteor;
2
- declare var SimpleSchema;
3
- declare var Match;
4
- declare var Creator;
5
- declare var Steedos;
6
- declare var WebApp;
7
- declare var WebAppInternals;
@@ -1,77 +0,0 @@
1
- import { hashStampedToken, insertHashedLoginToken, hashLoginToken, setAuthCookies } from '../utils';
2
- import { getSteedosSchema } from '@steedos/objectql'
3
-
4
- // function secretCallback(req, payload, done) {
5
- // let issuer = payload.iss
6
- // let collection = getSteedosSchema().getObject('OAuth2Clients')
7
- // collection.find({ filters: `clientId eq '${issuer}'` }).then(function (resolve) {
8
- // let clientInfo = resolve[0]
9
- // let clientSecret = clientInfo ? clientInfo.clientSecret : ''
10
- // done(null, clientSecret)
11
- // }).catch(function (reject) {
12
- // done(reject, '')
13
- // })
14
- // }
15
-
16
- async function getTokenInfo(req) {
17
- let payload = req.user
18
- let data = { userId: '', authToken: '' }
19
- let userObj = getSteedosSchema().getObject('users')
20
- let user = (await userObj.find({ filters: `username eq '${payload.username}'`, fields: ['_id'] }))[0]
21
- if (user) {
22
- let userId = user._id
23
- let authToken = payload.sessionId ? `${payload.iss}-${payload.username}-${payload.sessionId}` : `${payload.iss}-${payload.username}`
24
- let hashedToken = hashLoginToken(authToken).replace(/\//g, '%2F');
25
- let filters = `(services/resume/loginTokens/hashedToken eq '${hashedToken}')`;
26
- if (await userObj.count({ filters: filters })) {
27
- data = { userId: userId, authToken: authToken }
28
- } else {
29
- let stampedToken = {
30
- token: authToken,
31
- when: new Date
32
- }
33
- let hashedTokenObj = hashStampedToken(stampedToken)
34
- await insertHashedLoginToken(userId, hashedTokenObj)
35
-
36
- data = { userId: userId, authToken: authToken }
37
- }
38
- }
39
-
40
- return data;
41
- }
42
-
43
- export const jwtSSO = async (req, res) => {
44
- try {
45
- let jwt = require('jsonwebtoken');
46
- let token = req.query.jwt_token;
47
- if (!token) {
48
- throw new Error('jwt_token is needed!')
49
- }
50
- let decoded = jwt.decode(token, { complete: true });
51
- let payload = decoded.payload;
52
- let issuer = payload.iss;
53
- if (!issuer) {
54
- throw new Error('issuer is needed!')
55
- }
56
- let collection = getSteedosSchema().getObject('OAuth2Clients')
57
- let clients = await collection.find({ filters: `clientId eq '${issuer}'` })
58
- let clientInfo = clients[0]
59
- let secret = clientInfo ? clientInfo.clientSecret : ''
60
- let spaceId = clientInfo ? clientInfo.space : ''
61
- if (!secret) {
62
- throw new Error('secret is needed!')
63
- }
64
- if (!spaceId) {
65
- throw new Error('spaceId is needed!')
66
- }
67
- let verifiedPayload = jwt.verify(token, secret);
68
- let data = await getTokenInfo({ user: verifiedPayload })
69
- setAuthCookies(req, res, data.userId, data.authToken, spaceId)
70
- let redirectUrl = verifiedPayload.redirect_url;
71
- res.redirect(302, redirectUrl);
72
- } catch (error) {
73
- console.error(error);
74
- res.status(500).send(error.messenger)
75
- }
76
-
77
- }
@@ -1,38 +0,0 @@
1
-
2
- import * as express from 'express';
3
- const SHA256 = require("sha256");
4
- const bcrypt = require('bcryptjs');
5
- import { getSession } from '../session';
6
- import { setAuthCookies, generateStampedLoginToken, hashStampedToken, insertHashedLoginToken } from '../utils';
7
-
8
- declare var Meteor;
9
-
10
- export const login = async (req: express.Request, res: express.Response) => {
11
- let username = req.body["username"];
12
- let password = req.body["password"];
13
- let spaceId = req.body["spaceId"]; // 需要登录的工作区Id,如果不传入,自动选中第一个工作区
14
- let bcryptPassword = SHA256(password);
15
- let user = Meteor.users.findOne({
16
- $or: [{ "username": username }, { "emails.address": username }, { "mobile": username }]
17
- });
18
- if (!user) {
19
- res.status(401).send();
20
- return;
21
- }
22
- let match = await bcrypt.compare(bcryptPassword, user.services.password.bcrypt);
23
- if (!match) {
24
- res.status(401).send();
25
- return;
26
- }
27
- let authtToken = null;
28
- let stampedAuthToken = generateStampedLoginToken();
29
- authtToken = stampedAuthToken.token;
30
- let hashedToken = hashStampedToken(stampedAuthToken);
31
- await insertHashedLoginToken(user._id, hashedToken);
32
- let userSession = await getSession(authtToken, spaceId);
33
- // set cookie to response
34
- // maxAge 3 month
35
- setAuthCookies(req, res, user._id, authtToken, userSession.spaceId);
36
- res.setHeader('X-Space-Token', userSession.spaceId + ',' + authtToken);
37
- return res.send(userSession);
38
- }
@@ -1,8 +0,0 @@
1
-
2
- import * as express from 'express';
3
- import { clearAuthCookies } from '../utils';
4
-
5
- export const logout = async (req: express.Request, res: express.Response) => {
6
- clearAuthCookies(req, res);
7
- return res.end();
8
- }
@@ -1,33 +0,0 @@
1
-
2
- import * as express from 'express';
3
- import { auth } from '../session';
4
- import { setAuthCookies, clearAuthCookies } from '../utils';
5
- import { getSteedosSchema } from '@steedos/objectql';
6
-
7
- export const validate = async (req: express.Request, res: express.Response) => {
8
- let utcOffset = req.body.utcOffset;
9
- let userSession = await auth(req, res);
10
- let spaceUser = await getSteedosSchema().getObject('space_users').find({filters: [['space', '=', userSession.spaceId], ['user', '=', userSession.userId], ['user_accepted', '=', true]]});
11
- if (userSession.userId) {
12
- if(spaceUser.length > 0){
13
- let user = await getSteedosSchema().getObject('users').findOne(userSession.userId, { fields: ['utcOffset','password_expired','lockout'] });
14
- if(user.lockout){
15
- clearAuthCookies(req, res)
16
- }else{
17
- setAuthCookies(req, res, userSession.userId, userSession.authToken, userSession.spaceId);
18
- if (!user.hasOwnProperty('utcOffset')) {
19
- await getSteedosSchema().getObject('users').update(userSession.userId, { 'utcOffset': utcOffset })
20
- }
21
- return res.send(Object.assign({}, userSession, {password_expired: user.password_expired}));
22
- }
23
- }else{
24
- clearAuthCookies(req, res)
25
- }
26
- }
27
- clearAuthCookies(req, res);
28
- return res.status(401).send({
29
- "error": "Validate Request -- Missing X-Auth-Token",
30
- "instance": "1329598861",
31
- "success": false
32
- })
33
- }
@@ -1,19 +0,0 @@
1
- const express = require('express');
2
-
3
- import { login } from "./endpoints/login";
4
- import { logout } from "./endpoints/logout";
5
- import { validate } from "./endpoints/validate";
6
- import { jwtSSO } from "./endpoints/jwt";
7
-
8
- export const authExpress = express.Router();
9
-
10
- authExpress.post('/api/v4/users/login', login);
11
- authExpress.post('/api/v4/users/logout', logout);
12
- authExpress.post('/api/v4/users/validate', validate)
13
-
14
- // 保留以前的接口路由
15
- authExpress.post('/api/setup/login', login);
16
- authExpress.post('/api/setup/logout', logout)
17
- authExpress.post('/api/setup/validate', validate)
18
-
19
- authExpress.get('/jwt/sso', jwtSSO);
package/src/index.ts DELETED
@@ -1,8 +0,0 @@
1
- export { getSession, auth, setRequestUser, getSessionByUserId, getSessionByUserIdSync, removeUserSessionsCacheByUserId } from "./session";
2
- export * from "./utils";
3
- export * from "./tokenMap";
4
- export * from './userSession';
5
- export * from './spaceUserSession';
6
- export { authExpress } from "./express-middleware";
7
- export { getAPIKeyAuthHeader } from './apikey';
8
- export { requireAuthentication } from './auth-middleware';
package/src/session.ts DELETED
@@ -1,172 +0,0 @@
1
- import { SteedosUserSession, isTemplateSpace, wrapAsync } from '@steedos/objectql';
2
- import { Response } from "express";
3
- import { getUserIdByToken, removeUserTokens } from './tokenMap'
4
- import { getUserSession } from './userSession'
5
- import { getSpaceUserSession } from './spaceUserSession'
6
-
7
- import * as core from "express-serve-static-core";
8
- import { isAPIKey, verifyAPIKey } from './apikey';
9
-
10
- import isMobile from "ismobilejs";
11
- interface Request extends core.Request {
12
- user?: any;
13
- }
14
-
15
- const Cookies = require("cookies");
16
-
17
- function assignSession(spaceId, userSession, spaceSession) {
18
- let result = Object.assign({ spaceId: spaceId }, userSession, spaceSession);
19
- return reviseSession(result);
20
- }
21
-
22
- function reviseSession(session) {
23
- if (session) {
24
- delete session.expiredAt;
25
- delete session._id;
26
- }
27
- return session;
28
- }
29
-
30
- export async function getSessionByUserId(
31
- userId,
32
- spaceId?
33
- ): Promise<SteedosUserSession> {
34
- if (!userId) {
35
- return;
36
- }
37
-
38
- let userSession = await getUserSession(userId);
39
- if (!userSession) {
40
- return;
41
- }
42
-
43
- let spaceUserSession = {};
44
- if (spaceId) {
45
- spaceUserSession = await getSpaceUserSession(spaceId, userId);
46
- }
47
-
48
- return assignSession(spaceId, userSession, spaceUserSession);
49
- }
50
-
51
- export function getSessionByUserIdSync(userId, spaceId?): any {
52
- let getSessionFn = function() {
53
- return getSessionByUserId(userId, spaceId);
54
- };
55
- return wrapAsync(getSessionFn, {});
56
- }
57
-
58
- export async function getSession(
59
- token: string,
60
- spaceId?: string,
61
- clientInfos?: any
62
- ): Promise<SteedosUserSession> {
63
- if (!token) {
64
- return;
65
- }
66
- let userId = null;
67
- if (isAPIKey(token)) {
68
- const apiKeyInfo = await verifyAPIKey(token);
69
- if (apiKeyInfo) {
70
- userId = apiKeyInfo.userId;
71
- spaceId = apiKeyInfo.spaceId;
72
- }
73
- } else {
74
- userId = await getUserIdByToken(token, clientInfos);
75
- }
76
- if (!userId) {
77
- return;
78
- }
79
- let userSession = await getUserSession(userId);
80
- if (!userSession) {
81
- return;
82
- }
83
- let spaceUserSession = await getSpaceUserSession(spaceId, userId);
84
-
85
- return assignSession(spaceId, userSession, spaceUserSession);
86
- }
87
-
88
- export function getUserAgent(req: any) {
89
- let userAgent: string = (req.headers["user-agent"] as string) || "";
90
- if (req.headers["x-ucbrowser-ua"]) {
91
- // special case of UC Browser
92
- userAgent = req.headers["x-ucbrowser-ua"] as string;
93
- }
94
- return userAgent;
95
- }
96
-
97
- export function getLoginDevice(userAgent) {
98
- let is_phone = false;
99
- let is_tablet = false;
100
- if (userAgent) {
101
- try {
102
- const { phone, tablet } = isMobile(userAgent);
103
- is_phone = phone;
104
- is_tablet = tablet;
105
- } catch (Exception) {
106
- console.log(`Exception`, Exception);
107
- }
108
- }
109
- return { is_phone, is_tablet };
110
- }
111
-
112
- // 解析Request对象,返回SteedosUserSession类型
113
- export async function auth(request: Request, response: Response): Promise<any> {
114
- let cookies = new Cookies(request, response);
115
- let authToken: string =
116
- request.headers["x-auth-token"] || (cookies.get("X-Auth-Token") || "").replace(/"/g, "");
117
- let spaceToken = (cookies.get("X-Space-Token") || "").replace(/"/g, "");
118
- let authorization = request.headers.authorization;
119
- let spaceId =
120
- (request.params ? request.params.spaceId : null) ||
121
- (request.query ? request.query.space_id : null) ||
122
- request.headers["x-space-id"];
123
- if (authorization && authorization.split(" ")[0] == "Bearer") {
124
- let spaceAuthToken = authorization.split(" ")[1];
125
- if (isAPIKey(spaceAuthToken)) {
126
- authToken = spaceAuthToken;
127
- } else {
128
- if (!spaceId) {
129
- spaceId = spaceAuthToken.split(",")[0];
130
- }
131
- authToken = spaceAuthToken.split(",")[1];
132
- }
133
- }
134
-
135
- if (spaceToken) {
136
- if (!spaceId) {
137
- spaceId = spaceToken.split(",")[0];
138
- }
139
- if (!authToken) {
140
- authToken = spaceToken.split(",")[1];
141
- }
142
- }
143
-
144
- let userAgent = getUserAgent(request) || "";
145
- const loginDevice = getLoginDevice(userAgent);
146
-
147
- let user = await getSession(authToken, spaceId as string, loginDevice);
148
- if (isTemplateSpace(spaceId)) {
149
- return Object.assign({ authToken: authToken }, user, loginDevice, {
150
- spaceId: spaceId,
151
- });
152
- } else {
153
- return Object.assign({ authToken: authToken }, user, loginDevice);
154
- }
155
- }
156
-
157
- // 给Request对象添加user属性,值为SteedosUserSession类型
158
- export async function setRequestUser(
159
- request: Request,
160
- response: Response,
161
- next: () => void
162
- ) {
163
- let user = await auth(request, response);
164
- if (user.userId) {
165
- request.user = user;
166
- }
167
- next();
168
- }
169
-
170
- export function removeUserSessionsCacheByUserId(userId, is_phone) {
171
- return removeUserTokens(userId, is_phone);
172
- }