mirror of
https://github.com/strapi/strapi.git
synced 2025-09-26 08:52:26 +00:00
Add GraphQL register/login (#3879)
* Add GraphQL login * Add GraphQL register * Add graphql login/register/delete End2End test * Update from requests * Remove logging * Update to beta.16 * Update * Add error handling * Util function * Update
This commit is contained in:
parent
71c4745417
commit
edbff44c82
@ -201,7 +201,7 @@ async function watchAdmin({ dir, port, options }) {
|
|||||||
clientLogLevel: 'silent',
|
clientLogLevel: 'silent',
|
||||||
hot: true,
|
hot: true,
|
||||||
quiet: true,
|
quiet: true,
|
||||||
open: true,
|
open: true,
|
||||||
publicPath: options.publicPath,
|
publicPath: options.publicPath,
|
||||||
historyApiFallback: {
|
historyApiFallback: {
|
||||||
index: options.publicPath,
|
index: options.publicPath,
|
||||||
|
@ -1,4 +1,18 @@
|
|||||||
const _ = require('lodash');
|
const _ = require('lodash');
|
||||||
|
const { ApolloError } = require('apollo-server-koa');
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Throws an ApolloError if context body contains a bad request
|
||||||
|
* @param contextBody - body of the context object given to the resolver
|
||||||
|
* @throws ApolloError if the body is a bad request
|
||||||
|
*/
|
||||||
|
function checkBadRequest(contextBody) {
|
||||||
|
if (_.get(contextBody, 'output.payload.statusCode', 200) !== 200) {
|
||||||
|
const statusCode = _.get(contextBody, 'output.payload.statusCode', 400);
|
||||||
|
const message = _.get(contextBody, 'output.payload.message', 'Bad Request');
|
||||||
|
throw new ApolloError(message, statusCode, _.omit(contextBody, ['output']));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
module.exports = {
|
module.exports = {
|
||||||
type: {
|
type: {
|
||||||
@ -20,10 +34,25 @@ module.exports = {
|
|||||||
description: String
|
description: String
|
||||||
type: String
|
type: String
|
||||||
}
|
}
|
||||||
|
|
||||||
|
input UsersPermissionsLoginInput {
|
||||||
|
identifier: String!
|
||||||
|
password: String!
|
||||||
|
provider: String = "local"
|
||||||
|
}
|
||||||
|
|
||||||
|
type UsersPermissionsLoginPayload {
|
||||||
|
jwt: String!
|
||||||
|
user: UsersPermissionsUser!
|
||||||
|
}
|
||||||
`,
|
`,
|
||||||
query: `
|
query: `
|
||||||
me: UsersPermissionsMe
|
me: UsersPermissionsMe
|
||||||
`,
|
`,
|
||||||
|
mutation: `
|
||||||
|
login(input: UsersPermissionsLoginInput!): UsersPermissionsLoginPayload!
|
||||||
|
register(input: UserInput!): UsersPermissionsLoginPayload!
|
||||||
|
`,
|
||||||
resolver: {
|
resolver: {
|
||||||
Query: {
|
Query: {
|
||||||
me: {
|
me: {
|
||||||
@ -158,8 +187,40 @@ module.exports = {
|
|||||||
return {
|
return {
|
||||||
user,
|
user,
|
||||||
};
|
};
|
||||||
},
|
}
|
||||||
},
|
},
|
||||||
},
|
register: {
|
||||||
},
|
description: 'Register a user',
|
||||||
|
plugin: 'users-permissions',
|
||||||
|
resolverOf: 'Auth.register',
|
||||||
|
resolver: async (obj, options, {context}) => {
|
||||||
|
context.request.body = _.toPlainObject(options.input);
|
||||||
|
|
||||||
|
await strapi.plugins['users-permissions'].controllers.auth.register(context);
|
||||||
|
let output = context.body.toJSON ? context.body.toJSON() : context.body;
|
||||||
|
|
||||||
|
checkBadRequest(output);
|
||||||
|
return {
|
||||||
|
user: output.user || output, jwt: output.jwt
|
||||||
|
};
|
||||||
|
}
|
||||||
|
},
|
||||||
|
login: {
|
||||||
|
resolverOf: 'Auth.callback',
|
||||||
|
plugin: 'users-permissions',
|
||||||
|
resolver: async (obj, options, {context}) => {
|
||||||
|
context.params = {...context.params, provider: options.input.provider};
|
||||||
|
context.request.body = _.toPlainObject(options.input);
|
||||||
|
|
||||||
|
await strapi.plugins['users-permissions'].controllers.auth.callback(context);
|
||||||
|
let output = context.body.toJSON ? context.body.toJSON() : context.body;
|
||||||
|
|
||||||
|
checkBadRequest(output);
|
||||||
|
return {
|
||||||
|
user: output.user || output, jwt: output.jwt
|
||||||
|
};
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
@ -246,7 +246,6 @@ module.exports = {
|
|||||||
const data = await strapi.plugins['users-permissions'].services.user.remove(
|
const data = await strapi.plugins['users-permissions'].services.user.remove(
|
||||||
{ id }
|
{ id }
|
||||||
);
|
);
|
||||||
|
|
||||||
ctx.send(data);
|
ctx.send(data);
|
||||||
},
|
},
|
||||||
|
|
||||||
|
@ -0,0 +1,138 @@
|
|||||||
|
// Test a simple default API with no relations
|
||||||
|
|
||||||
|
const { registerAndLogin } = require('../../../test/helpers/auth');
|
||||||
|
const { createAuthRequest } = require('../../../test/helpers/request');
|
||||||
|
|
||||||
|
let rq;
|
||||||
|
let graphqlQuery;
|
||||||
|
let data = {};
|
||||||
|
|
||||||
|
describe('Test Graphql Users API End to End', () => {
|
||||||
|
beforeAll(async () => {
|
||||||
|
const token = await registerAndLogin();
|
||||||
|
rq = createAuthRequest(token);
|
||||||
|
|
||||||
|
graphqlQuery = body => {
|
||||||
|
return rq({
|
||||||
|
url: '/graphql',
|
||||||
|
method: 'POST',
|
||||||
|
body,
|
||||||
|
});
|
||||||
|
};
|
||||||
|
}, 60000);
|
||||||
|
|
||||||
|
describe('Test register and login', () => {
|
||||||
|
const user = {
|
||||||
|
username: 'User 1',
|
||||||
|
email: 'user1@strapi.io',
|
||||||
|
password: 'test1234',
|
||||||
|
};
|
||||||
|
|
||||||
|
test('Register a user', async () => {
|
||||||
|
const res = await graphqlQuery({
|
||||||
|
query: /* GraphQL */ `
|
||||||
|
mutation register($input: UserInput!) {
|
||||||
|
register(input: $input) {
|
||||||
|
jwt
|
||||||
|
user {
|
||||||
|
id
|
||||||
|
email
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
`,
|
||||||
|
variables: {
|
||||||
|
input: user,
|
||||||
|
},
|
||||||
|
});
|
||||||
|
|
||||||
|
const { body } = res;
|
||||||
|
|
||||||
|
expect(res.statusCode).toBe(200);
|
||||||
|
expect(body).toMatchObject({
|
||||||
|
data: {
|
||||||
|
register: {
|
||||||
|
jwt: expect.any(String),
|
||||||
|
user: {
|
||||||
|
id: expect.any(String),
|
||||||
|
email: user.email,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
});
|
||||||
|
data.user = res.body.data.register.user;
|
||||||
|
});
|
||||||
|
|
||||||
|
test('Log in a user', async () => {
|
||||||
|
const res = await graphqlQuery({
|
||||||
|
query: /* GraphQL */ `
|
||||||
|
mutation login($input: UsersPermissionsLoginInput!) {
|
||||||
|
login(input: $input) {
|
||||||
|
jwt
|
||||||
|
user {
|
||||||
|
id
|
||||||
|
email
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
`,
|
||||||
|
variables: {
|
||||||
|
input: {
|
||||||
|
identifier: user.username,
|
||||||
|
password: user.password,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
});
|
||||||
|
|
||||||
|
const { body } = res;
|
||||||
|
|
||||||
|
expect(res.statusCode).toBe(200);
|
||||||
|
expect(body).toMatchObject({
|
||||||
|
data: {
|
||||||
|
login: {
|
||||||
|
jwt: expect.any(String),
|
||||||
|
user: {
|
||||||
|
id: expect.any(String),
|
||||||
|
email: user.email,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
});
|
||||||
|
data.user = res.body.data.login.user;
|
||||||
|
});
|
||||||
|
|
||||||
|
test('Delete a user', async () => {
|
||||||
|
const res = await graphqlQuery({
|
||||||
|
query: /* GraphQL */ `
|
||||||
|
mutation deleteUser($input: deleteUserInput) {
|
||||||
|
deleteUser(input: $input) {
|
||||||
|
user {
|
||||||
|
email
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
`,
|
||||||
|
variables: {
|
||||||
|
input: {
|
||||||
|
where: {
|
||||||
|
id: data.user.id,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
});
|
||||||
|
|
||||||
|
const { body } = res;
|
||||||
|
|
||||||
|
expect(res.statusCode).toBe(200);
|
||||||
|
expect(body).toMatchObject({
|
||||||
|
data: {
|
||||||
|
deleteUser: {
|
||||||
|
user: {
|
||||||
|
email: data.user.email,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
@ -7,7 +7,7 @@
|
|||||||
// Public node modules.
|
// Public node modules.
|
||||||
const _ = require('lodash');
|
const _ = require('lodash');
|
||||||
const sendmail = require('sendmail')({
|
const sendmail = require('sendmail')({
|
||||||
silent: true
|
silent: true,
|
||||||
});
|
});
|
||||||
|
|
||||||
/* eslint-disable no-unused-vars */
|
/* eslint-disable no-unused-vars */
|
||||||
@ -17,14 +17,14 @@ module.exports = {
|
|||||||
auth: {
|
auth: {
|
||||||
sendmail_default_from: {
|
sendmail_default_from: {
|
||||||
label: 'Sendmail Default From',
|
label: 'Sendmail Default From',
|
||||||
type: 'text'
|
type: 'text',
|
||||||
},
|
},
|
||||||
sendmail_default_replyto: {
|
sendmail_default_replyto: {
|
||||||
label: 'Sendmail Default Reply-To',
|
label: 'Sendmail Default Reply-To',
|
||||||
type: 'text'
|
type: 'text',
|
||||||
}
|
},
|
||||||
},
|
},
|
||||||
init: (config) => {
|
init: config => {
|
||||||
return {
|
return {
|
||||||
send: (options, cb) => {
|
send: (options, cb) => {
|
||||||
return new Promise((resolve, reject) => {
|
return new Promise((resolve, reject) => {
|
||||||
@ -35,23 +35,28 @@ module.exports = {
|
|||||||
options.text = options.text || options.html;
|
options.text = options.text || options.html;
|
||||||
options.html = options.html || options.text;
|
options.html = options.html || options.text;
|
||||||
|
|
||||||
sendmail({
|
sendmail(
|
||||||
from: options.from,
|
{
|
||||||
to: options.to,
|
from: options.from,
|
||||||
replyTo: options.replyTo,
|
to: options.to,
|
||||||
subject: options.subject,
|
replyTo: options.replyTo,
|
||||||
text: options.text,
|
subject: options.subject,
|
||||||
html: options.html,
|
text: options.text,
|
||||||
attachments: options.attachments
|
html: options.html,
|
||||||
}, function (err) {
|
attachments: options.attachments,
|
||||||
if (err) {
|
},
|
||||||
reject([{ messages: [{ id: 'Auth.form.error.email.invalid' }] }]);
|
function(err) {
|
||||||
} else {
|
if (err) {
|
||||||
resolve();
|
reject([
|
||||||
|
{ messages: [{ id: 'Auth.form.error.email.invalid' }] },
|
||||||
|
]);
|
||||||
|
} else {
|
||||||
|
resolve();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
});
|
);
|
||||||
});
|
});
|
||||||
}
|
},
|
||||||
};
|
};
|
||||||
}
|
},
|
||||||
};
|
};
|
||||||
|
Loading…
x
Reference in New Issue
Block a user