GoogleOAuth с паспортом, график-йогой и призмой - PullRequest
0 голосов
/ 09 октября 2018

В настоящее время я создаю функцию входа в систему через Google, и у меня есть некоторые проблемы, которые меня смущают.

Можем ли мы использовать Restful API и Graphql API в одном проекте?За исключением Google Authentication, нам нужен какой-то маршрут, чтобы справиться с этим.Для операций CRUD мы используем Graphql.

Примерно так:

const { GraphQLServer } = require('graphql-yoga');
const { Prisma } = require('prisma-binding');
const resolvers = require('./resolvers');
const passport = require('passport');
const GoogleStrategy = require('passport-google-oauth20').Strategy;

passport.serializeUser((user, done) => {
  done(null, user.id);
});

passport.deserializeUser((id, done) => {

  // mongoose.
  User.findById(id).then(user => {
    done(null, user);
  });

});

passport.use(new GoogleStrategy(
  {
    clientID: process.env.GOOGLE_CLIENT_ID,
    clientSecret: process.env.GOOGLE_CLIENT_SECRET,
    callbackURL: '/auth/google/callback',
  },
  (accessToken, refreshToken, profile, done) => {
    console.log(profile);

    // After receive profile info from google, call mutation and save
    // profile into database.
  }
));

const db = new Prisma({
  typeDefs: 'src/generated/prisma.graphql',
  endpoint: process.env.PRISMA_ENDPOINT,
  debug: true,
  secret: process.env.PRISMA_SECRET,
});

const server = new GraphQLServer({
  typeDefs: './src/schema.graphql',
  resolvers,
  resolverValidationOptions: {
    requireResolversForResolveType: false
  },
  context: req => ({ ...req, db })
});

server.express.get('/auth/connect', passport.authenticate('google', {
  scope: ['profile', 'email']
}));

server.express.get('/auth/google/callback', passport.authenticate('google'));

server.start(() => console.log(`Server is running on ${process.env.PRISMA_ENDPOINT}`));

В функции обратного вызова GoogleStrategy как я могу вызвать Mutation и сохранить всю информацию профиля из Google в базу данных?

(accessToken, refreshToken, profile, done) => {
    console.log(profile);

    // After receiving profile info from google, call mutation and save
    // profile into the database.
  }

А в deserializeUser и serializeUser функция.Раньше, когда я работал с Nodejs и MongoDB, я делал это:

passport.serializeUser((user, done) => {
   done(null, user.id);
});

passport.deserializeUser((id, done) => {

  // mongoose.
  User.findById(id).then(user => {
    done(null, user);
  });

});

А с Prisma и Graphql как решить эту проблему с мутацией?

1 Ответ

0 голосов
/ 10 декабря 2018

На вашем сервере вы создаете экземпляр prisma-binding, который затем передаете в контекст graphql-yoga.Это позволяет вам выполнять призменные операции в ваших резольверах следующим образом:

context.db.query.user({where: {id: 'ABCD'}})

Но это не значит, что вы не можете использовать экземпляр prisma-binding в другом месте!

В своем паспортеобратные вызовы, вы можете получить доступ к своему экземпляру prisma-binding, а также запросить вызовы и мутации:

db.mutation.createUser({data: {name: 'John Doe'}})
...