Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- //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);
- }
- };
Add Comment
Please, Sign In to add comment