护照Google Oatuth 2.0身份验证

时间:2020-07-25 16:04:18

标签: javascript reactjs passport.js typeorm passport-google-oauth2

我有两个文件: googleAuth.ts(辅助文件)

import passport from 'passport';
import {User} from './entity/User';
const GoogleStrategy = require('passport-google-oauth20').Strategy;

const googleOptions = {
  clientID: process.env.clientID,
  clientSecret: process.env.clientSecret,
  callbackURL: 'http://localhost:4000/auth/google/callback'
};

const googleCallback = (_accessToken: any, _refreshToken: any, profile: any, done: any) => {
  // User.findOneOrFail({googleId: profile.id})
  // .then( user => {
  //   done(null,user)
  // })
  // .catch(err => done(err,null))
  User.findOne({googleId: profile.id})
  .then( user =>{
    if(user){
      return done(null, user)
    }
    else return done(null, null)
  })
  
}

export const googleAuth = () => passport.use(new GoogleStrategy(
  googleOptions,
  googleCallback
));

和index.ts(main):

import "reflect-metadata";
import {createConnection} from "typeorm";
import "dotenv/config"
import express from "express";
import { ApolloServer } from "apollo-server-express";
import { buildSchema } from "type-graphql";
import cors from "cors";
import { PostResolver } from "./resolvers/PostResolver";
import { UserResolver } from "./resolvers/UserResolver";
import path from 'path';
import passport from "passport";
import { googleAuth} from './googleAuth';

(async () => {

     await createConnection();
     googleAuth();

     passport.serializeUser(function(user: any, done: any) {
       done(null, user);
     });

     passport.deserializeUser(function(user: any, done: any) {
       done(null, user);
     });

      const app = express();

      app.use(cors());

      app.use(passport.initialize());

      app.get('/auth/google', passport.authenticate('google', { scope: ['profile', 'email'] }));
  
      app.get('/auth/google/callback', passport.authenticate('google', {
        successRedirect: 'http://localhost:4000/success',
        failureRedirect: 'http://localhost:4000/fail',
      }));

      const apolloServer = new ApolloServer({
         schema: await buildSchema({
         resolvers: [ PostResolver, UserResolver ]
      }),

        context: ({ req, res }) => ({ req, res })
      });

        ...

      const port = process.env.PORT || 4000;

      app.listen(port, () => console.log(`Server started on port ${port}`));

 })();

我不知道它的外观,但是在auth / google / callback上出现此错误(google error):

Authorization Error
Error 400: invalid_request
Missing required parameter: scope
Learn more

稍后,我需要以某种方式获取登录的数据(我想到了Resolver,它将从上下文中加载数据)。

在我的Google应用程序凭据中,我具有: http:// localhost:4000作为授权的JavaScript来源

以http:// localhost:4000 / auth / google / callback作为授权重定向URI

0 个答案:

没有答案