使用 parse-server 云代码进行 facebook 身份验证

use parse-server cloud code to do facebook authentication

我已经使用云代码将 Apollo GraphQL 与解析服务器集成在一起。我现在想公开身份验证突变(在云代码中),它将接受 facebook authData 并对用户进行身份验证,因此它可以 return sessionToken 作为结果。

GraphQL 在这里是次要的 - 它只是一个上下文来解释为什么我需要在云代码中做所有这些(我正在使用解析服务器托管提供商并且使用云代码是唯一合理的方式来获得GraphQL 工作)。

要在此处显示更多详细信息,请参阅集成的完成方式 https://github.com/ciekawy/parse-server-back4app-graphql-boilerplate

并且不只是将 link、app.js 放入 cloud 文件夹中看起来像

var fs = require("fs");
var path = require("path");

var apollo_server_express = require("apollo-server-express");
var graphql_tools = require("graphql-tools");
var bodyParser = require("body-parser");
var cors = require("cors");
var resolvers = {
    Query: {
        hello() { return "Hello world!"; }
    }
};

var schema = graphql_tools.makeExecutableSchema({
    typeDefs: fs.readFileSync(path.join(__dirname, './graphql/schema.graphql'), 'utf8'),
    resolvers: resolvers
});

app.use('/graphql', cors(), bodyParser.json(), apollo_server_express.graphqlExpress({ schema: schema }));
app.use('/graphiql', apollo_server_express.graphiqlExpress({
    endpointURL: '/graphql'
}));

等等 resolvers 我想添加

Mutation: {
  authenticate(obj, args, context) {
     // here call some parse-server link with
  } 
}

我尝试以不同的方式使用 linkWith 但没有成功。

更新:根据 parse-server's github 上的讨论,我正在尝试做的事情甚至可能不受支持。通过更好地了解内部结构,我可以在那里开票。

我看到了两种可能的解决方法(尽管我对它们不满意)

  1. 只需将 REST 用于 oauth signup/login(这里的主要缺点是无法提供原子帐户初始化 - 即创建额外的用户数据结构,另一个是无法完全迁移到GraphQL)

  2. 执行从云代码 GraphQL 突变到自身的环回 REST 调用

更新:特别是对于 GraphQL - 解析服务器,因为 v3.6.0 引入了对所有解析服务器的原生 GraphQL 支持 API。这意味着开箱即用 GraphQL auth mutation。此外,从 v3.7.2 开始,它还支持映射到云 code/cloud 函数的自定义模式。

以下解决方法对通用云代码仍然有效。

原始答案:

至于现在,我最终完成了从云代码到自身的内部 http 调用 - 如果有人想在同样的情况下进行,这里就是。

async function authenticateWithFacebook({userProfile, ...authData}) {
    try {
        const response: HttpResponse = (await httpRequest({
            url: 'https://local-parse-server/users/',
            body: authData,
            method: 'POST',
            headers: {
                'Content-Type': 'application/json', // without this line return error is about missing user or password
                'X-Parse-Application-Id': APPLICATION_ID,
                'X-Parse-REST-API-Key': REST_API_KEY,
                'X-Parse-Revocable-Session': 1
            }
        }));
        const { data: { sessionToken }} = response;
        // here we can also do Parse.User.become(sessionToken)
        return sessionToken;
    } catch (e) {
        console.error('error during authentication', e);
    }
}

Sill 会欢迎没有环回 http 调用的解决方案。