@ accounts/graphql-api 账户
带有 JS 账户的 GraphQL 服务器的 Schema、 解析器和 Utils
此软件包不需要任何网络接口 / express 来与您的 GraphQL 组合 - 这只是 GraphQL 的图集, 解析器和 utils !
如何使用这个包裹?
此软件包将导出 GraphQL 策略和 GraphQL 解析器, 您可以用您现有的 GraphQL 策略服务器扩展 .
从国家防范机制/亚恩安装开始:
// Npm
npm install --save @accounts/server @accounts/graphql-api @graphql-modules/core
// Yarn
yarn add @accounts/server @accounts/graphql-api @graphql-modules/core
此软件包不创建传送器或其他任何设备,仅将图案和字符串及解析器作为对象.
从配置开始 AccountsServer 随你便 例如,使用MongoDB:
import mongoose from 'mongoose'
import AccountsServer from '@accounts/server'
import AccountsPassword from '@accounts/password'
import MongoDBInterface from '@accounts/mongo'
const db = mongoose.connection
const password = new AccountsPassword()
const accountsServer = new AccountsServer({
{
db: new MongoDBInterface(db),
tokenSecret: 'SECRET',
},
{
password,
}
});
下一个,导入 AccountsModule 从这个包,运行它与您的 AccountsServer数字 :
import { AccountsModule } from '@accounts/graphql-api';
const accountsGraphQL = AccountsModule.forRoot({
accountsServer,
});
现在,添加 accountsGraphQL.typeDefs 到您的计划定义( 在使用它之前) makeExecutableSchema,然后将您的解析器对象与 accountsGraphQL.resolvers 通过使用 @graphql-tools/epoxy,例如:
import { makeExecutableSchema } from '@graphql-tools/schema';
import { mergeGraphQLSchemas, mergeResolvers } from '@graphql-tools/epoxy';
const typeDefs = [
`
type Query {
myQuery: String
}
type Mutation {
myMutation: String
}
schema {
query: Query,
mutation: Mutation
}
`,
accountsGraphQL.typeDefs,
];
let myResolvers = {
Query: {
myQuery: () => 'Hello',
},
Mutation: {
myMutation: () => 'Hello',
},
};
const schema = makeExecutableSchema({
resolvers: mergeResolvers([accountsGraphQL.resolvers, myResolvers]),
typeDefs: mergeGraphQLSchemas([typeDefs]),
});
最后一步是扩展你 graphqlExpress 带有上下文中间软件,从 HTTP 请求中提取认证令牌,因此 AccountsServer 会自动验证它:
app.use(
GRAPHQL_ROUTE,
bodyParser.json(),
graphqlExpress((request) => {
return {
context: {
...accountsGraphQL(request),
// your context
},
schema,
};
})
);
认证解析器
你可以证明自己的决心 JSAccounts 通过使用 authenticated 方法.
这种方法作曲家也延伸 context 使用当前认证的用户 !
这是受保护突变的例子:
import AccountsServer from '@accounts/server';
import { authenticated } from '@accounts/graphql-api';
export const resolver = {
Mutation: {
updateUserProfile: authenticated((rootValue, args, context) => {
// Write your resolver here
// context.user - the current authenticated user!
}),
},
};
自定义
此软件包允许您自定义 GraphQL 方案, 它是解析器 .
例如,一些应用程序主查询被调用 MyQuery 或者说 RootQuery 而不是查询,所以您可以自定义名称,而不修改应用程序的设置.
这些是现有的定制:
rootQueryName(字符串) - 根查询的名称, 默认 :Query。 。 。 .rootMutationName(字符串) - 根突变的名称,默认:Mutation。 。 。 .extend(boolean) - 是否添加extend在根类型声明前,默认:true。 。 。 .withSchemaDefinition(布尔语):是否添加schema { ... }向生成计划声明, 默认:false。 。 。 .
通过第二个对象 createAccountsGraphQL,例如:
另一种可能的定制是修改认证头的名称,使用它 accountsContext (默认为 Authorization:
const myCustomGraphQLAccounts = AccountsModule.forRoot({
accountsServer,
rootQueryName: 'RootQuery',
rootMutationName: 'RootMutation',
headerName: 'MyCustomHeader',
});
扩展 User
延长 User 对象带有自定义字段和逻辑,添加您自己的 GraphQL 类型定义 User 带有前缀 extend,并添加您的字段:
extend type User {
firstName: String
lastName: String
}
并且为您添加的字段执行固定解析器:
const UserResolver = {
firstName: () => 'Dotan',
lastName: () => 'Simha',
};
扩展 User 密码创建期间
要在用户创建期间扩展用户对象,您需要扩展 CreateUserInput 键入并添加您的字段 :
extend input CreateUserInput {
profile: CreateUserProfileInput!
}
input CreateUserProfileInput {
firstName: String!
lastName: String!
}
用户将随配置文件密钥集被保存在 db 中 .
示例:使用服务认证
mutation Authenticate {
authenticate(serviceName: "password", params: { password: "<pw>", user: { email: "<email>" } })
}
serviceName- 与您用来认证的软件包相对应(例如:oauth、密码、twitter、instagram、两个系数、指使等).params- 这些会不同 取决于你使用的服务.
- 推特/Instagram
mutation Authenticate {
authenticate(
serviceName: "twitter"
params: { access_token: "<access-token>", access_token_secret: "<access-token-secret>" }
)
}
- 奥奥特
mutation Authenticate {
authenticate(serviceName: "oauth", params: { provider: "<your-provider>" })
}
- 密码: 下方
user包含email但可以包含一个或多个id, (中文(简体) ),email或者说username我也一样.
mutation Authenticate {
authenticate(serviceName: "password", params: { password: "<pw>", user: { email: "<email>" } })
}
- 两个因素
mutation Authenticate {
authenticate(serviceName: "two-factor", params: { code: "<two-factor-code>" })
}
- 脚本
mutation Authenticate {
authenticate(serviceName: "token", params: { token: "<token>" })
}
校验认证
检查用户是否成功认证的方法是相同的,但 verifyAuthentication 返回 a boolean 而不是一个 LoginResult数字 :
mutation Verify {
verifyAuthentication(
serviceName: "password"
params: { password: "<pw>", user: { email: "<email>" } }
)
}
如果用户已成功认证, 这将返回类似此结果 :
{
"data": {
"verifyAuthentication": true
}
}