# Authentication
Desolid authenticates users by JSON Web Tokens (JWT). Whenever the user wants to access a protected route or resource, the user agent should send the JWT, in the Authorization header using the Bearer schema. The content of the header should look like the following:
Authorization: Bearer <token>
# Requesting a Token
For generating a token you can query to the authenticate api:
authenticate(email:"carmen@example.com", password:"secret") {
token
user {
id
name
avatar {
url
}
}
}
# Configuration
Generated Token will expire in by default 48 hours. the value is customizable on the authentication section of the config file:
api:
port: 3000
authentication:
secret: 'secret'
expiration: 24 # hours
upload:
maxFileSize: 64 # MB
# Custom Credential field
You can add any custom credential field by adding those with @unique directive to the User model extension:
extend type User
@model
@authorization(
CREATE: [Admin]
READ: [Admin, "$user.id == {{id}}"]
UPDATE: [Admin, "$user.id == {{id}}"]
DELETE: [Admin] #
) {
phone: PhoneNumber! @unique
}
These new fields will come on the authenticate API automatically.
# Creating Users
createUser and createManyUsers mutations are where you can request creating users:
mutation {
createUser(data: { email: "carmen@example.com", name: "Carmen", password: "secret", group: Admin }) {
id
createdAt
}
}
According to the primitive User model, only admin users are authorized to create new users:
type User
@model
@authorization(
CREATE: [Admin]
READ: [Admin, "$user.id == {{id}}"]
UPDATE: [Admin, "$user.id == {{id}}"]
DELETE: [Admin]
) {
id: ID!
createdAt: DateTime!
updatedAt: DateTime!
email: EmailAddress! @unique
password: Password!
group: UserGroup!
name: String!
}
But it's customizable and you can edit access rules on your schema file:
extend enum UserGroup {
Editor
Author
}
extend type User
@model
@authorization(
CREATE: [Admin, Editor]
READ: [Admin, "$user.id == {{id}}"]
UPDATE: [Admin, "$user.id == {{id}}"]
DELETE: [Admin] #
) {
avatar: File @upload(accept: ["image/jpeg"], size: { max: "5", min: "0.1" })
}
TIP
The known issue here is that, you don't can change authorisation rulls of the User model without adding or overriding a new field.
Also, by removing CREATE rule you can allow anybody to create a user:
extend type User
@model
@authorization(
READ: [Admin, "$user.id == {{id}}"]
UPDATE: [Admin, "$user.id == {{id}}"]
DELETE: [Admin] #
) {
avatar: File @upload(accept: ["image/jpeg"], size: { max: "5", min: "0.1" })
}
WARNING
In this case, the API needs to protect against DDOS attacks and it didn't implement yet.
# Initial Admin user
Desolid skips User model authorization till the first Admin user creation or when all Admin users are removed. so it's recommanded to create the admin user as the first usage of the api.
For indicating the state of admin users you can query this like:
{
system {
adminUserExists
}
}