【问题标题】:use parse-server cloud code to do facebook authentication使用 parse-server 云代码进行 facebook 身份验证
【发布时间】:2019-08-02 20:15:32
【问题描述】:

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

GraphQL 在这里是次要的——它只是解释为什么我需要在云代码中完成所有这些的上下文(我也在使用解析服务器托管服务提供商,并且使用云代码是让 GraphQL 工作的唯一合理方法)。

在这里显示更多细节是集成是如何完成的 https://github.com/ciekawy/parse-server-back4app-graphql-boilerplate

为了不只是放一个链接,app.jscloud 文件夹中看起来像

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 注册/登录(这里的主要缺点是无法提供原子帐户初始化 - 即创建额外的用户数据结构,另一个是无法完全迁移到 GraphQL)

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

【问题讨论】:

  • 您是否面临任何消息错误?与未经授权或空结果相关的内容?
  • 取决于我使用的方法,即:ParseError { code: 252, message: 'This authentication method is unsupported.' },最接近的是user already exists - 但仍有可能在尝试验证 FB 令牌之前引发错误。
  • 您使用的是哪个 Parse 服务器版本?
  • 目前是 2.7.4。可供我使用的最新版本是 2.8.4 测试版

标签: javascript graphql parse-server apollo


【解决方案1】:

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

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

原始答案:

至于现在,我最终完成了从云代码到自我的内部 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 调用的解决方案。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-04-24
    • 2016-04-14
    • 1970-01-01
    • 2017-11-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多