2015-10-10 34 views
9

是否可以验证用户身份不同的角色仅仅海槽graphql服务器结合中继&反应?Relayjs Graphql用户认证

我环顾四周,并没有找到有关此主题的很多信息。

在我的当前设置,以不同的角色登录功能,目前仍在低谷传统的REST API ...(“安全”与JSON网络令牌)。

回答

6

我做到了我的应用程序之一,基本上你只需要一个用户界面,在第一根查询这一个返回NULL,如果没有人登录,那么你就可以登录突变传递凭据更新。 主要问题是获取后继请求中的cookie或会话,因为它不处理请求中的cookie字段。

这里是我的客户突变:

export default class LoginMutation extends Relay.Mutation { 
    static fragments = { 
    user:() => Relay.QL` 
     fragment on User { 
     id, 
     mail 
     } 
    `, 
    }; 
    getMutation() { 
    return Relay.QL`mutation{Login}`; 
    } 

    getVariables() { 
    return { 
     mail: this.props.credentials.pseudo, 
     password: this.props.credentials.password, 
    }; 
    } 
    getConfigs() { 
    return [{ 
     type: 'FIELDS_CHANGE', 
     fieldIDs: { 
     user: this.props.user.id, 
     } 
    }]; 
    } 
    getOptimisticResponse() { 
    return { 
     mail: this.props.credentials.pseudo, 
    }; 
    } 
    getFatQuery() { 
    return Relay.QL` 
    fragment on LoginPayload { 
     user { 
     userID, 
     mail 
     } 
    } 
    `; 
    } 
} 

,这里是我的架构侧突变

var LoginMutation = mutationWithClientMutationId({ 
    name: 'Login', 
    inputFields: { 
    mail: { 
     type: new GraphQLNonNull(GraphQLString) 
    }, 
    password: { 
     type: new GraphQLNonNull(GraphQLString) 
    } 
    }, 
    outputFields: { 
    user: { 
     type: GraphQLUser, 
     resolve: (newUser) => newUser 
    } 
    }, 
    mutateAndGetPayload: (credentials, { 
    rootValue 
    }) => co(function*() { 
    var newUser = yield getUserByCredentials(credentials, rootValue); 
    console.log('schema:loginmutation'); 
    delete newUser.id; 
    return newUser; 
    }) 
}); 

让我的用户通过网页刷新记录的我把我自己的要求,并填补它与一个cookie现场......这是现在,使其工作的唯一途径...

+0

谢谢,我会尝试明天。你是否在getUserByCredentials函数中封装了“我发送自己的请求并填充cookie字段”? – Seneca

+0

实际上,这实际上是继电器的问题,您无法在发布请求下访问cookie。我一直等到突变返回客户端,我发送一个全新的自制获取请求与凭据来填充我的cookie ...,然后刷新你通过您的HTML发送用户ID,并在您传递该用户ID的根查询。 – Duduche

+2

在没有重置功能的情况下([Relay目前没有](https://github.com/facebook/relay/issues/233)),通过Relay本身做这件事可能不是一个好主意。由于Relay在内部缓存GraphQL数据,并且该数据可能是用户特定的,因此您需要一种在注销或登录时使缓存失效的方法。目前,我们建议人们在发生任何一个事件时都会进行整页刷新。 – wincent