护照用户无法从 Apollo Resolver 中的 Req 获得
Passport User not available from Req inside Apollo Resolver
我正在使用 Koa、Apollo 和 Passport,但我无法从 Apollo Resolver 中的 req.user 访问 Passport 用户。我还有一个简单的 REST 端点。当我从其余端点的路由调用 ctx.req.user 时,它会返回用户名、电子邮件等。
但是,Apollo Resolver 中相同的 req.user 语句返回时未定义。如果我自己调用 ctx.req 那么我可以将完整的请求记录到包含 cookie/session.
的控制台
我怀疑(主要是因为我尝试了所有其他方法)这可能是因为我在应用 Passport 中间件之前在我的 app.ts 文件中创建了 Apollo 服务器。但是,我不确定情况是否如此,我也不知道要做出什么改变。我也很慢将我主要工作的代码库分开来改变它。
//app.ts
import Koa = require('koa');
import { getGraphqlApp} from './graphql/get-apollo-server'
import { config } from './config/config';
import { BaseContext } from 'koa';
import * as passport from 'koa-passport';
//Create the Apollo Server and the Koa App
const server = getGraphqlApp();
const app = new Koa();
console.log()
//Apply the App onto the Apollo Server
server.applyMiddleware({ app, path: config.graphqlUri });
//Export the App so that we can import it in server.ts
module.exports = app;
//get-apollo-server.ts
import { makeAugmentedSchema } from 'neo4j-graphql-js';
import { ApolloServer } from 'apollo-server-koa';
import {typeDefs} from './get-graphql-schema'//../typeDefs';
import { getNeo4jDriver} from '../database/connection-neo4j'
import resolvers from './resolvers'
const driver = getNeo4jDriver();
export function getGraphqlApp(): ApolloServer {
const schema = makeAugmentedSchema({
typeDefs,
resolvers,
config: {
query: false,
mutation: false
}
//resolverValidationOptions: { requireResolversForResolveType: false }
});
const graphqlOptions = {
schema,
context: (
{ ctx }
) => {
return {
driver,
ctx
};
},
playground: true,
formatError: error => {
return error
},
introspection: true
};
return new ApolloServer(graphqlOptions);
}
//resolver.ts
import { neo4jgraphql } from "neo4j-graphql-js";
const resolvers = {
Query: {
Dataset(object, params, ctx, resolveInfo) {
return neo4jgraphql(object, params, ctx, resolveInfo);
},
DatasetAttributes(object, params, ctx, resolveInfo) {
return neo4jgraphql(object, params, ctx, resolveInfo);
},
Idiom(object, params, ctx, resolveInfo) {
console.log(ctx.ctx.req.user)
if (!1) {
throw new Error("request not authenticated");
} else {
return neo4jgraphql(object, params, ctx, resolveInfo);
}
},
}
};
export default resolvers;
问题是我在将 Passport 应用到应用程序之前启动了 Apollo 服务器。我按照以下修改了 app.ts 文件并从 server.ts 中删除了护照部分以使其正常工作:
import Koa = require('koa');
import { getGraphqlApp} from './graphql/get-apollo-server'
import { config } from './config/config';
import { BaseContext } from 'koa';
import * as session from 'koa-session';
import * as passport from 'koa-passport';
//Create the Apollo Server and the Koa App
const server = getGraphqlApp();
const app = new Koa();
//Setup the session
app.keys = ['infornite-secret-key'];
app.use(session(app));
//Setup Authentication
require('./config/auth');
app.use(passport.initialize());
app.use(passport.session());
//Apply the App onto the Apollo Server
server.applyMiddleware({ app, path: config.graphqlUri });
//Export the App so that we can import it in server.ts
module.exports = app;
我正在使用 Koa、Apollo 和 Passport,但我无法从 Apollo Resolver 中的 req.user 访问 Passport 用户。我还有一个简单的 REST 端点。当我从其余端点的路由调用 ctx.req.user 时,它会返回用户名、电子邮件等。
但是,Apollo Resolver 中相同的 req.user 语句返回时未定义。如果我自己调用 ctx.req 那么我可以将完整的请求记录到包含 cookie/session.
的控制台我怀疑(主要是因为我尝试了所有其他方法)这可能是因为我在应用 Passport 中间件之前在我的 app.ts 文件中创建了 Apollo 服务器。但是,我不确定情况是否如此,我也不知道要做出什么改变。我也很慢将我主要工作的代码库分开来改变它。
//app.ts
import Koa = require('koa');
import { getGraphqlApp} from './graphql/get-apollo-server'
import { config } from './config/config';
import { BaseContext } from 'koa';
import * as passport from 'koa-passport';
//Create the Apollo Server and the Koa App
const server = getGraphqlApp();
const app = new Koa();
console.log()
//Apply the App onto the Apollo Server
server.applyMiddleware({ app, path: config.graphqlUri });
//Export the App so that we can import it in server.ts
module.exports = app;
//get-apollo-server.ts
import { makeAugmentedSchema } from 'neo4j-graphql-js';
import { ApolloServer } from 'apollo-server-koa';
import {typeDefs} from './get-graphql-schema'//../typeDefs';
import { getNeo4jDriver} from '../database/connection-neo4j'
import resolvers from './resolvers'
const driver = getNeo4jDriver();
export function getGraphqlApp(): ApolloServer {
const schema = makeAugmentedSchema({
typeDefs,
resolvers,
config: {
query: false,
mutation: false
}
//resolverValidationOptions: { requireResolversForResolveType: false }
});
const graphqlOptions = {
schema,
context: (
{ ctx }
) => {
return {
driver,
ctx
};
},
playground: true,
formatError: error => {
return error
},
introspection: true
};
return new ApolloServer(graphqlOptions);
}
//resolver.ts
import { neo4jgraphql } from "neo4j-graphql-js";
const resolvers = {
Query: {
Dataset(object, params, ctx, resolveInfo) {
return neo4jgraphql(object, params, ctx, resolveInfo);
},
DatasetAttributes(object, params, ctx, resolveInfo) {
return neo4jgraphql(object, params, ctx, resolveInfo);
},
Idiom(object, params, ctx, resolveInfo) {
console.log(ctx.ctx.req.user)
if (!1) {
throw new Error("request not authenticated");
} else {
return neo4jgraphql(object, params, ctx, resolveInfo);
}
},
}
};
export default resolvers;
问题是我在将 Passport 应用到应用程序之前启动了 Apollo 服务器。我按照以下修改了 app.ts 文件并从 server.ts 中删除了护照部分以使其正常工作:
import Koa = require('koa');
import { getGraphqlApp} from './graphql/get-apollo-server'
import { config } from './config/config';
import { BaseContext } from 'koa';
import * as session from 'koa-session';
import * as passport from 'koa-passport';
//Create the Apollo Server and the Koa App
const server = getGraphqlApp();
const app = new Koa();
//Setup the session
app.keys = ['infornite-secret-key'];
app.use(session(app));
//Setup Authentication
require('./config/auth');
app.use(passport.initialize());
app.use(passport.session());
//Apply the App onto the Apollo Server
server.applyMiddleware({ app, path: config.graphqlUri });
//Export the App so that we can import it in server.ts
module.exports = app;