2017-09-03 37 views
0

我使用React作为前端和REST API作为后端,我的REST发布http只有Cookie我在前端存储和使用每个REST请求,例如代码Atlassian JIRA have auth like that,现在我想要将该解决方案从REST迁移到GraphQL,并且如果已经解决了GraphQL端的授权问题(只有Apollo具有Cookie和JWT授权机制,更不用说本地实现),但我仍然无法弄清楚如何发布Cookie/JWT来自GraphQL方面。GraphQL发行JWT/Cookie

是否有可能从GraphQL提供我cookie?问题是GraphQL如何在客户端上设置新的cookie?是否可以像set-cookie头一样?

回答

1

如果您想避免拥有单独的身份验证端点,而是希望能够向您的GraphQL端点发送突变并生成授权cookie,您需要修改如何设置您的GraphQL端点服务器。

使用express-graphqlapollo-server-express时,默认情况下,您的请求对象作为上下文传递给解析器。为了让您的响应对象,你必须包装您的端点是这样的:

app.use('/graphql', (req, res) => { 
    return graphqlHTTP({ 
    schema, 
    context: { req, res }, 
    })(req, res); 
); 

内分解为突变,然后可以设置使用res.cookie()饼干。

搬运东西这种方式可以是一个痛苦,但 - 你可能想利用身份验证的一个或多个独立的终端,这样可以让你利用图书馆像passport做繁重。

+0

但问题是,graphql可以为客户端颁发授权cookie吗? – MyMomSaysIamSpecial

+0

对不起,如果我误解你的问题。请参阅上面的编辑。 –

+0

非常感谢您,所以据我所知,可以从graphql返回cookie,但这是一个真正的痛苦,并且您提供了两个端点,例如cookie的/ auth和/ graphql api的/ graphql从第一个cookie。这就像1%将“休息一样”,和99%的图。 (我的术语可能是错的,因为我对图很陌生) – MyMomSaysIamSpecial

1

为了将预先存在的令牌传递到GraphQL查询或突变中,您只需将令牌分配给查询/突变中的variables对象。

以下是使用Apollo的graphql高级组件并从Redux Store中提取令牌的示例。在这里,我正在解构一个queryParams分支,该分支与库react-router-redux一起工作,以自动提取并保存活动url上的任何查询参数到redux商店。

const FetchTrackingInfo = gql` 
 
    query FetchTrackingInfo($token: String!) { // create a $token variable reference and declare the Scalar type. 
 
    FetchTrackingInfo(token: $token) { // assign a token parameter to the variable $token 
 
     error { 
 
     hard 
 
     soft 
 
     message 
 
     } 
 
     shipDate 
 
     orderId 
 
     trackingNumber 
 
     trackingInfo { 
 
     location 
 
     date 
 
     activity 
 
     } 
 
    } 
 
    } 
 
`; 
 

 
const OrderTrackingWithData = graphql(
 
    FetchTrackingInfo, { 
 
    name: 'TrackingInfo', 
 
    options: ({ queryParams }) => { // destructuring queryParams from the redux store. 
 
     const token = queryParams.token ? queryParams.token : ''; 
 

 
     return ({ 
 
     variables: { token }, // assign token to the variables of the query/mutation. 
 
     }); 
 
    }, 
 
    }, 
 
)(OrderTracking); // Pass in your React component to the HOC: graphql

现在,如果你的意思是你想创建当你说“如何从Graphql侧发出的Cookie /智威汤逊”的客户一个JWT令牌,那么这是一个潜在的安全漏洞在您的应用程序。智威汤逊在签署/创建令牌时需要Secret。通常这是出于安全原因通过环境变量提供的。客户端浏览器公开地公开所有环境变量。这意味着,通过客户端创建/发布新的JWT令牌充其量是一种不好的做法,并且最坏的情况是一个巨大的安全缺陷。

+0

预先存在:) – MyMomSaysIamSpecial