Skip to content

Commit 40c82b5

Browse files
committed
prepare user interactions
1 parent cf13bdd commit 40c82b5

File tree

10 files changed

+262
-9
lines changed

10 files changed

+262
-9
lines changed

package.json

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,7 @@
77
"private": true,
88
"scripts": {
99
"start": "babel-node src/index.js",
10-
"dev":
11-
"nodemon -L -e js,graphql src/index.js --exec \"node --require dotenv/config --require babel-register\"",
10+
"dev": "nodemon -L -e js,graphql src/index.js --exec \"node --require dotenv/config --require babel-register\"",
1211
"lint": "eslint .",
1312
"build": "babel src -d dist -s",
1413
"serve": "node dist/index.js"
@@ -27,11 +26,15 @@
2726
"graphql-date": "^1.0.3",
2827
"graphql-tag": "^2.7.3",
2928
"graphql-tools": "^2.0.0",
29+
"jsonwebtoken": "^8.2.0",
3030
"lodash": "^4.17.4",
3131
"merge-graphql-schemas": "^1.3.0",
3232
"mongoose": "^5.0.3",
3333
"node-fetch": "^2.0.0",
34-
"prettier-eslint": "^8.2.0"
34+
"passport": "^0.4.0",
35+
"passport-jwt": "^4.0.0",
36+
"prettier-eslint": "^8.2.0",
37+
"react-native-rsa": "^0.0.3"
3538
},
3639
"devDependencies": {
3740
"babel-cli": "^6.26.0",

scripts/importAll.js

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,3 @@
1-
import ProgressBar from 'cli-progress'; // eslint-disable-line
2-
import program from 'commander'; // eslint-disable-line
3-
41
import client from '../src/graphql/client';
52
import Procedure from '../src/models/Procedure';
63
import getAllProcedures from '../src/graphql/queries/getAllProcedures';

src/express/auth/index.js

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
import mongoose from 'mongoose';
2+
import passport from 'passport';
3+
4+
import jwt from './jsonWebToken';
5+
6+
export default (app) => {
7+
const User = mongoose.model('User');
8+
9+
app.use(passport.initialize());
10+
// app.use(passport.session());
11+
12+
passport.serializeUser((user, done) => {
13+
done(null, user.id);
14+
});
15+
16+
passport.deserializeUser(async (id, done) => {
17+
done(null, await User.findById(id));
18+
});
19+
20+
jwt(app);
21+
};

src/express/auth/jsonWebToken.js

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
/* eslint no-underscore-dangle: ["error", { "allow": ["_id"] }] */
2+
import { Strategy, ExtractJwt } from 'passport-jwt';
3+
import passport from 'passport';
4+
import mongoose from 'mongoose';
5+
6+
export default (app) => {
7+
const UserModel = mongoose.model('User');
8+
9+
passport.use(new Strategy(
10+
{
11+
jwtFromRequest: ExtractJwt.fromExtractors([
12+
ExtractJwt.fromUrlQueryParameter('auth_token'),
13+
ExtractJwt.fromAuthHeaderAsBearerToken(),
14+
]),
15+
secretOrKey: process.env.AUTH_JWT_SECRET,
16+
},
17+
async (jwtPayload, done) => {
18+
try {
19+
const user = await UserModel.findById(jwtPayload._id);
20+
if (!user) {
21+
return done(null, false);
22+
}
23+
return done(null, user);
24+
} catch (err) {
25+
return done(err, false);
26+
}
27+
},
28+
));
29+
30+
app.use((req, res, next) => {
31+
passport.authenticate('jwt', { session: true }, (err, user) => {
32+
// console.log(info);
33+
if (user) {
34+
req.user = user;
35+
}
36+
next();
37+
})(req, res, next);
38+
});
39+
40+
app.get('/test', (req, res) => {
41+
res.send({ query: req.query, user: req.user });
42+
});
43+
};

src/graphql/resolvers/User.js

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
/* eslint-disable no-underscore-dangle */
2+
import RSAKey from 'react-native-rsa';
3+
4+
export default {
5+
Query: {
6+
me: (parent, args, { UserModel, user }) => {
7+
if (user) {
8+
return UserModel.findById(user._id);
9+
}
10+
return null;
11+
},
12+
},
13+
14+
Mutation: {
15+
signUp: async (parent, { deviceHashEncrypted }, { UserModel }) => {
16+
const rsa = new RSAKey();
17+
18+
rsa.setPrivateString(process.env.SECRET_KEY);
19+
const deviceHash = rsa.decrypt(deviceHashEncrypted);
20+
const user = await UserModel.create({ deviceHash });
21+
22+
return { token: user.createToken() };
23+
},
24+
25+
signIn: async (parent, { deviceHashEncrypted }, { UserModel }) => {
26+
const user = await UserModel.findOne({ deviceHashEncrypted });
27+
if (!user) {
28+
throw new Error('User does not exsit!');
29+
}
30+
31+
return { token: user.createToken() };
32+
},
33+
},
34+
};

src/graphql/schemas/User.js

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
export default `
2+
type User {
3+
_id: String!
4+
deviceHash: String!
5+
}
6+
7+
type Auth {
8+
token: String!
9+
}
10+
11+
type Mutation {
12+
signUp(deviceHashEncrypted: String!): Auth
13+
signIn(deviceHashEncrypted: String!): Auth
14+
}
15+
16+
type Query {
17+
me: User
18+
}
19+
`;

src/index.js

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,8 +14,11 @@ import resolvers from './graphql/resolvers';
1414

1515
import webhook from './scripts/webhook';
1616

17+
import auth from './express/auth';
18+
1719
// Models
1820
import ProcedureModel from './models/Procedure';
21+
import UserModel from './models/User';
1922

2023
const app = express();
2124

@@ -35,6 +38,8 @@ if (process.env.ENGINE_API_KEY) {
3538

3639
app.use(bodyParser.json());
3740

41+
auth(app);
42+
3843
if (process.env.ENVIRONMENT !== 'production') {
3944
app.use(
4045
constants.GRAPHIQL_PATH,
@@ -48,8 +53,10 @@ app.use(constants.GRAPHQL_PATH, (req, res, next) => {
4853
graphqlExpress({
4954
schema,
5055
context: {
56+
user: req.user,
5157
// Models
5258
ProcedureModel,
59+
UserModel,
5360
},
5461
tracing: true,
5562
cacheControl: true,

src/models/User.js

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
/* eslint no-underscore-dangle: ["error", { "allow": ["_id"] }] */
2+
import mongoose, { Schema } from 'mongoose';
3+
import jwt from 'jsonwebtoken';
4+
5+
const UserSchema = new Schema(
6+
{
7+
deviceHash: { type: String, required: true, unique: true },
8+
},
9+
{ timestamps: true },
10+
);
11+
12+
UserSchema.methods = {
13+
createToken() {
14+
return jwt.sign(
15+
{
16+
_id: this._id,
17+
},
18+
process.env.AUTH_JWT_SECRET,
19+
);
20+
},
21+
};
22+
23+
export default mongoose.model('User', UserSchema);

src/scripts/import.js

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,3 @@
1-
import ProgressBar from 'cli-progress'; // eslint-disable-line
2-
import program from 'commander'; // eslint-disable-line
3-
41
import createClient from '../graphql/client';
52
import Procedure from '../models/Procedure';
63
import getProcedures from '../graphql/queries/getProcedures';

0 commit comments

Comments
 (0)