Graphik:身份识别文档和图形数据库

2020-12-13 09:11:18

--allow-headers字符串cors允许标题(env:GRAPHIK_ALLOW_HEADERS)(默认[*])--allow-methods字符串cors允许方法(env:GRAPHIK_ALLOW_METHODS)(默认[HEAD,GET,POST,PUT,PATCH,DELETE] --allow-origins字符串cors允许原点(env:GRAPHIK_ALLOW_ORIGINS)(默认[*])--metrics启用prometheus& pprof指标(emv:GRAPHIK_METRICS = true)(默认为true)--open-id字符串open id连接发现uri例如:https://accounts.google.com/.well-known/openid-configuration(env:GRAPHIK_OPEN_ID)- -playground-client-id字符串游乐场oauth客户端ID(env:GRAPHIK_PLAYGROUND_CLIENT_ID)--playground-client-secret字符串游乐场oauth客户端密码(env:GRAPHIK_PLAYGROUND_CLIENT_SECRET --playground-redirect字符串游乐场oauth重定向(env:GRAPHIK_PLAYGROUND_REDIRECT() 34; http:// localhost:7820 / playground / callback")--root-users字符串一个绕过注册授权者的电子邮件地址列表(env:GRAPHIK_ROOT_USERS)--storage字符串持久存储路径(env:GRAPHIK_STORAGE_PATH)(默认" / tmp / graphik")--tls-cert到tls证书的字符串路径(env:GRAPHIK_TLS_CERT)--tls-key到tls密钥的字符串路径(env:GRAPHIK_TLS_KEY)

message Ref {// // gtype是doc / connection的类型,例如:pet字符串gtype = 1 [(validator.field)= {regex:" ^。{1,225} $"}]; // gid是文档/连接在其类型字符串上下文中的唯一ID gid = 2 [(validator.field)= {regex:" ^。{1,225} $" }];}

message Doc {// ref是对文档的引用ref ref = 1 [(validator.field)= {msg_exists:true}]; // k / v对google.protobuf.Struct属性= 2;}

message Connection {// ref是对连接的引用ref ref = 1 [(validator.field)= {msg_exists:true}]; //属性是k / v对google.protobuf.Struct属性= 2; //如果连接是双向布尔定向= 3,则定向为假; // from是文档ref,它是连接ref from = 4 [(validator.field)= {msg_exists:true}]的源; // to是文档引用,它是连接引用的目标= 5 [(validator.field)= {msg_exists:true}];}

访问令牌授权:所有数据库功能都需要来自已配置的开放ID连接标识提供者的Bearer $ {token}

访问令牌用于从oidc元数据url提取的oidc userinfo端点获取用户信息

如果数据库中没有用户,则将在gtype下自动创建一个用户:以其电子邮件地址为gid的用户

一旦提取了用户,就针对数据库中任何已注册的授权者(CEL表达式)对其进行评估(连同request& request方法)。 索引可用于加快对大量元素进行迭代的查询 类型验证器是针对特定类型的Doc或Connection进行评估以强制执行自定义约束的CEL表达式 每当创建文档时,也会创建从原始用户到新文档的类型连接 每当创建文档时,也会创建从新文档到原始用户的created_by类型的连接 每当编辑文档时,也会创建从原始用户到新文档的已编辑类型的连接(如果不存在) 每当编辑文档时,也会创建从新文档到原始用户的edited_by类型的连接(如果不存在)

可以通过遍历方法查询用户曾经与之交互过的每个文档,并将用户作为遍历的根文档

在我看来,gRPC是svc-svc通信与通讯的王者。 graphQL是开发用户界面和应用程序的王者探索数据。

在graphik中,graphQL& gRPC几乎相同,但是每个请求都通过gRPC服务器本地流动-graphQL api从技术上讲是一个包装程序,可用于开发用户界面&从graphQL游乐场查询数据库。

gRPC服务器性能更高,因此建议您在开发后端API时导入一个gRPC客户端库之一,而不要使用graphQL端点。

graphQL端点对于开发公共用户界面特别有用,因为它可以通过授权者,cors,验证器和& tls。

所有服务器->客户端流/订阅通过gRPC或graphQL中的Stream()端点启动。在此通道上接收的所有消息都包括触发/发送消息的用户。通道上的消息可以通过CEL表达式进行过滤,以便仅将消息推送到客户端消息可以通过gRPC&中的Broadcast()方法直接发送到通道。 graphQL.graphik中的所有状态更改都由graphik发送到状态通道,该通道可以像其他任何通道一样被订阅。

如果设置了以下环境变量/标志,则将在/ playground上提供受SSO保护的graphQL游乐场

GRAPHIK_PLAYGROUND_CLIENT_ID = $ {client_id}#oauth2应用程序/客户端idGRAPHIK_PLAYGROUND_CLIENT_SECRET = $ {client_secret}#oauth2应用程序/客户端密钥GRAPHIK_PLAYGROUND_REDIRECT = $ {playground_redirect}#oauth2授权句柄重定向到/ callback回调:

{" data&#34 ;: {" me&#34 ;: {" ref&#34 ;: {" gid&#34 ;:" coleman。 [email protected]&#34 ;,&gptype&#34 ;:"用户" },"属性:#" email&#34 ;:" [email protected]&#34 ;、" email_verified&#34 ;:是," family_name&#34 ;:" Word&#34 ;、" given_name&#34 ;:" Coleman&#34 ;、" hd" :" graphikdb.io&#34 ;," locale&#34 ;:" en&#34 ;," name&#34 ;:" Coleman Word& #34 ;,"图片&#34 ;:" https://lh3.googleusercontent.com/--LNU8XICB1A/AAAAAAAAAAI/AAAAAAAAAAA/AMZuuckp6gwH9JVkhlRkk-PTZdyDFctArg/s96-c/photo.jpg&#34 ;," sub:#105385978122958973720" }}},"扩展名&#34 ;: {}}

查询{getSchema(其中:{}){doc_types connection_types授权者{授权者{名称表达式}}验证者{验证者{名称表达式}}索引{索引{名称表达式}}}}

{" data&#34 ;: {" getSchema&#34 ;: {" doc_types&#34 ;: [" dog&#34 ;," human& #34;,&#34 ;、用户" ]," connection_types":[" created"," created_by"," edited"," editedby&# 34 ;、所有者" ]," authorizers&#34 ;: {" authorizers" :: [{" name&#34 ;:" testing&#34 ;," expression &#34 ;:" this.user.attributes.email.contains(\" coleman \")" }]}," validators&#34 ;: {" validators&#34 ;: [{" name&#34 ;:" testing&#34 ;,&#34 ; expression&#34 ;:" this.user.attributes.email.contains(\" coleman \")" }]},"索引&#34 ;: {"索引&#34 ;: [{"名称&#34 ;:"测试&#34 ;,&#34 ; expression&#34 ;:" this.attributes.primary_owner" }]}}},扩展名&#34 ;: {}}

变异{createDoc(输入:{参考:{gtype:" note"}属性:{标题:"洗碗"}}){ref {gid gtype}属性}}

{" data&#34 ;: {" createDoc&#34 ;: {" ref&#34 ;: {" gid&#34 ;:" 1lU0w0QjiI0jnNL8XMzWJHqQmTd& #34;,&g34 type&#34 ;:" note" },"属性:{" title&#34 ;:"洗碗" }}},"扩展名&#34 ;: {}}

#在这里查询{遍历(输入:{根:{gid:" [email protected]" gtype:" user")算法:BFS限制:6 max_depth:1 max_hops:10}){遍历{doc {ref {gid gtype}} traversal_path {gid gtype}深度跳}}}}

查询{traverseMe(其中:{max_hops:100 max_depth:1限制:5}){遍历{traversal_path {gtype gid}深度跳doc {ref {gid gtype}}}}}

{" data&#34 ;: {" traverseMe&#34 ;: {" traversals&#34 ;: [{" traversal_path&#34 ;: null,&#34 ; depth&#34 ;: 0," hops&#34 ;: 0," doc&#34 ;: {" ref&#34 ;: {" gid&# 34 ;:" [email protected]&#34 ;," gtype&#34 ;:"用户" }}},{" traversal_path&#34 ;: [{" gtype&#34 ;:" user&#34 ;," gid&#34 ;:&#34 ; [email protected]" }]," depth&#34 ;: 1," hops&#34 ;: 1," doc&#34 ;: {" ref&#34 ;: {& #34; gid&#34 ;:" 1lU0w0QjiI0jnNL8XMzWJHqQmTd&#34 ;,&g34type&#34 ;:" note" }}}]}},扩展名&#34 ;: {}}

{" data&#34 ;: {" stream&#34 ;: {" data&#34 ;: {" attributes&#34 ;: {" title &#34 ;:洗碗" }," ref&#34 ;: {" gid&#34 ;:" 1lUAK3uwwmhQ503ByzC9nCvdH6W&#34 ;," gtype&#34 ;:" note&# 34; }},"用户&#34 ;: {" gid&#34 ;:" [email protected]&#34 ;," gtype&#34 ;: "用户" }}},"扩展名&#34 ;: {}}

无论采用哪种部署方法,请设置以下环境变量或将其包含在$ {pwd} /。env文件中

版本:' 3.7'服务:graphik:图片:graphikdb / graphik:v0.5.0 env_file:-.env端口:-" 7820:7820" -" 782:7821"卷:-默认:/ tmp / graphik网络:默认:别名:-graphikdbnetworks:默认:卷:默认: