DEV Community

Cover image for [Solved] Appwrite user role missing or missing scope errors
Kaushal
Kaushal

Posted on • Edited on

[Solved] Appwrite user role missing or missing scope errors

Appwrite is awesome tool to use if you want to build applications fast but sometimes you may run into errors that can be frustrating and for me those errors were always about "User role missing" or "user not authorized to do this" etc. Even though I have full access to any instance of my app doing anything.

But finally I have found a way to fix them all (well maybe not all but i would like to think that).

So this discord post actually explained it in a very subtle way.

The catch is to make sure there is a session by using any of these methods I mean whichever you are using in your project.

  • createAnonymousSession
  • createEmailPasswordSession
  • createOAuth2Session
  • createSession

Let me give you an example where I faced this error then it might be more clear.

I had a signup page and what I want to do is as soon as user clicks on create account or signup it should trigger a verification email but I was getting the error that user is not authorized. The solution was to create a session before triggering the email so see the following code how I am creating session before triggering the email:

"use client";

import Link from "next/link";
import { FormEvent } from "react";
import { Button } from "@/components/ui/button";
import {
  Card,
  CardContent,
  CardDescription,
  CardHeader,
  CardTitle,
} from "@/components/ui/card";
import { Input } from "@/components/ui/input";
import { Label } from "@/components/ui/label";
import { createAuthAccount } from "@/app/appwrite/createAuthAccount";
import { createLoginSession } from "@/app/appwrite/createLoginSession";
import { useRouter } from "next/navigation";
import { sendVerificationEmail } from "@/app/appwrite/sendVerificationEmail";

export const description =
  "A sign up form with first name, last name, email and password inside a card. There's an option to sign up with GitHub and a link to login if you already have an account";

export default function LoginForm() {
  const router = useRouter();
  const signUpFormHandler = async (event: FormEvent) => {
    event.preventDefault();
    const formData = new FormData(event.target as HTMLFormElement);
    const data = Object.fromEntries(formData.entries());
    const createdAccount = await createAuthAccount({
      email: data?.email.toString(),
      password: data?.password.toString(),
      name: data?.["full-name"].toString(),
    });
    if (createdAccount?.$id) {
      await createLoginSession({
        email: data?.email.toString(),
        password: data?.password.toString(),
      });
      await sendVerificationEmail();
    }
  };

  return (
    <Card className="mx-auto max-w-sm">
      <CardHeader>
        <CardTitle className="text-xl">Sign Up</CardTitle>
        <CardDescription>
          Enter your information to create an account
        </CardDescription>
      </CardHeader>
      <CardContent>
        <form onSubmit={signUpFormHandler} className="grid gap-4">
          <div className="grid gap-2">
            <Label htmlFor="full-name">Full name</Label>
            <Input name="full-name" id="full-name" placeholder="Max" required />
          </div>
          <div className="grid gap-2">
            <Label htmlFor="email">Email</Label>
            <Input
              id="email"
              type="email"
              placeholder="m@example.com"
              required
              name="email"
            />
          </div>
          <div className="grid gap-2">
            <Label htmlFor="password">Password</Label>
            <Input name="password" id="password" type="password" />
          </div>
          <Button type="submit" className="w-full">
            Create an account
          </Button>
        </form>
        <div className="mt-4 text-center text-sm">
          Already have an account?{" "}
          <Link href="#" className="underline">
            Sign in
          </Link>
        </div>
      </CardContent>
    </Card>
  );
}

Enter fullscreen mode Exit fullscreen mode

This is just an example that depicts what was the intended behaviour and what was happening and what was suppose to be done.

Just wanted to share it in case any new beginners to Appwrite like me facing this error. All in all I have found that almost in all cases when I am getting any scope errors or user not authorized errors then creating a session or atleast making sure a session is existing before calling that method fixed those issues. So do give these a try and let me know what happens

Top comments (1)

Collapse
 
cxj_dev profile image
Chand Jamba

Great, I also faced the same issue. However, now I get the solution.
Thanks👍