Skip to content

Instantly share code, notes, and snippets.

@codeartistryio
Created February 14, 2019 22:25
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save codeartistryio/14a25fbeb0b47d027e733f1b3b94d5c1 to your computer and use it in GitHub Desktop.
Save codeartistryio/14a25fbeb0b47d027e733f1b3b94d5c1 to your computer and use it in GitHub Desktop.
//server
const { ApolloServer } = require("apollo-server");
const typeDefs = require("./typeDefs");
const resolvers = require("./resolvers");
const { findOrCreateUser } = require("./controllers/userController");
const mongoose = require("mongoose");
require("dotenv").config();
mongoose
.connect(process.env.MONGO_URI, { useNewUrlParser: true })
.then(() => console.log("DB connected!"))
.catch(err => console.error(err));
const server = new ApolloServer({
typeDefs,
resolvers,
context: async ({ req }) => {
let authToken = null;
let currentUser = null;
try {
authToken = req.headers.authorization;
if (authToken) {
currentUser = await findOrCreateUser(authToken);
}
} catch (err) {
console.warn(`Unable to authenticate using auth token: ${authToken}`);
}
return { authToken, currentUser };
}
});
server.listen().then(({ url }) => {
console.log(`Server listening on ${url}`);
});
//userController.js
const User = require("../models/User");
const { AuthenticationError } = require("apollo-server");
const { OAuth2Client } = require("google-auth-library");
const client = new OAuth2Client(process.env.OAUTH_CLIENT_ID);
exports.findOrCreateUser = async token => {
if (!token) {
throw new AuthenticationError("No auth token provided");
}
const googleUser = await verifyAuthToken(token);
const user = await checkIfUserExists(googleUser.email);
return user ? user : saveUser(googleUser);
};
const checkIfUserExists = async email => await User.findOne({ email }).exec();
const saveUser = googleUser => {
const { email, name, picture } = googleUser;
const user = { email, name, picture };
return new User(user).save();
};
const verifyAuthToken = async token => {
try {
const ticket = await client.verifyIdToken({
idToken: token,
audience: process.env.OAUTH_CLIENT_ID
});
return ticket.getPayload();
} catch (err) {
console.error("Error verifying auth token", err);
}
};
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment