Node.js 关于如何处理';graphql redis订阅';与apollo server一起使用时的身份验证

Node.js 关于如何处理';graphql redis订阅';与apollo server一起使用时的身份验证,node.js,graphql,apollo-server,graphql-subscriptions,Node.js,Graphql,Apollo Server,Graphql Subscriptions,我使用的是来自的“graphql redis订阅”。 本文给出了几个关于如何设置订阅的示例,这些示例实际上是有效的,但我面临的问题是如何进行身份验证并允许只有登录的客户端用户才能侦听订阅。我使用Apollo服务器提供graphql API,如下所示: const server = new ApolloServer({ schema, dataSources, context: async ({ req, connection

我使用的是来自的“graphql redis订阅”。 本文给出了几个关于如何设置订阅的示例,这些示例实际上是有效的,但我面临的问题是如何进行身份验证并允许只有登录的客户端用户才能侦听订阅。我使用Apollo服务器提供graphql API,如下所示:

const server = new ApolloServer({
            schema,
            dataSources,
            context: async ({ req, connection }) => {
                if (connection) {
                    return {
                        ...connection.context
                    };
                }

                const token = req.headers[API_TOKEN];

                return {
                    premiumAuth: token
                };
            },
        });
        server.listen(5000);

在阿波罗服务器的
上下文
选项中进行身份验证用于HTTP协议请求身份验证。这意味着它将保护
/graphql
端点不受未经身份验证的访问。例如

const contextFunction:contextFunction=(
上下文:IContextFunctionParams,
):上下文=>{
const{req,connection}=context;
如果(连接){
返回connection.context;
}否则{
const-token:string=validateToken(请求);
const userConnector=新的userConnector(memoryDB);
let user:IUser |未定义;
试一试{
const userType:userType=userType[token];
user=userConnector.finduserbyuser类型(userType);
}捕获(错误){
投掷误差;
}
返回{
请求者:用户,
位置连接器:新的位置连接器(memoryDB),
用户连接器,
templateConnector:新的templateConnector(
memoryDB,
pubsub,
//postgresPubSub,
),
};
}
};
对于WebSocket协议连接,graphql订阅依赖于该连接。 您需要在
订阅中进行身份验证

const server=新服务器({
typeDefs,
解析器,
context:contextFunction,
反省:没错,
订阅:{
onConnect:(
connectionParams:IWebSocketConnectionParams,
webSocket:webSocket,
connectionContext:connectionContext,
) => {
log('websocketconnect');
log('connectionParams:',connectionParams);
if(connectionParams.token){
const token:string=validateToken(connectionParams.token);
const userConnector=新的userConnector(memoryDB);
let user:IUser |未定义;
试一试{
const userType:userType=userType[token];
user=userConnector.finduserbyuser类型(userType);
}捕获(错误){
投掷误差;
}
常量上下文:ISubscriptionContext={
//pubsub:postgresPubSub,
pubsub,
订阅用户:用户,
用户连接器,
位置连接器:新的位置连接器(memoryDB),
};
返回上下文;
}
抛出新错误('缺少身份验证令牌!');
},
onDisconnect:(webSocket:webSocket,connectionContext:connectionContext)=>{
log('websocketdisconnect');
},
},
});

源代码:

apollo server
上下文
选项中进行身份验证用于HTTP协议请求身份验证。这意味着它将保护
/graphql
端点不受未经身份验证的访问。例如

const contextFunction:contextFunction=(
上下文:IContextFunctionParams,
):上下文=>{
const{req,connection}=context;
如果(连接){
返回connection.context;
}否则{
const-token:string=validateToken(请求);
const userConnector=新的userConnector(memoryDB);
let user:IUser |未定义;
试一试{
const userType:userType=userType[token];
user=userConnector.finduserbyuser类型(userType);
}捕获(错误){
投掷误差;
}
返回{
请求者:用户,
位置连接器:新的位置连接器(memoryDB),
用户连接器,
templateConnector:新的templateConnector(
memoryDB,
pubsub,
//postgresPubSub,
),
};
}
};
对于WebSocket协议连接,graphql订阅依赖于该连接。 您需要在
订阅中进行身份验证

const server=新服务器({
typeDefs,
解析器,
context:contextFunction,
反省:没错,
订阅:{
onConnect:(
connectionParams:IWebSocketConnectionParams,
webSocket:webSocket,
connectionContext:connectionContext,
) => {
log('websocketconnect');
log('connectionParams:',connectionParams);
if(connectionParams.token){
const token:string=validateToken(connectionParams.token);
const userConnector=新的userConnector(memoryDB);
let user:IUser |未定义;
试一试{
const userType:userType=userType[token];
user=userConnector.finduserbyuser类型(userType);
}捕获(错误){
投掷误差;
}
常量上下文:ISubscriptionContext={
//pubsub:postgresPubSub,
pubsub,
订阅用户:用户,
用户连接器,
位置连接器:新的位置连接器(memoryDB),
};
返回上下文;
}
抛出新错误('缺少身份验证令牌!');
},
onDisconnect:(webSocket:webSocket,connectionContext:connectionContext)=>{
log('websocketdisconnect');
},
},
});

源代码:

订阅web套接字端点通过添加以下内容神奇地工作,但我不明白为什么
if(connection){return{…connection.context};}
subscription web套接字端点通过添加以下内容神奇地工作,但我不明白为什么<代码>如果(连接){