【GraphQL】Prismaを使って、ログイン機能を追加する
GraphQL

【GraphQL】Prismaを使って、ログイン機能を追加する

作成日:2021年11月25日
更新日:2021年11月26日

前回は、パスワードをハッシュ化しました。

graphql-prisma-bcrypt

【GraphQL】パスワードをハッシュ化する

今回は、Prisma を使って、ログイン機能を追加します。

コードは、前回のコードを使用します。

まずは、ログイン機能のスキーマを作成します。

schema.ts のMutationsigninを作成します。

signinの指定は、signupと同じにします。

ts
type Mutation {
addBook(input: AddBookInput!): BookPayload!
deleteBook(id: Int!): BookPayload!
updateBook(id: Int!, input: UpdateBookInput!): BookPayload!
signup(email: String!, password: String!): AuthPayload!
signin(email: String!, password: String!): AuthPayload!
}

スキーマが完成したので、次はリゾルバーを作成します。

resolvers フォルダの Mutation.ts を開きます。

Mutation に signin を作成します。

ts
signin: async (_:any, {email, password}: MutationUser, { prisma }: Context): Promise<UserPayload> => {
},

PostgresSQL データのemailと、入力したメールアドレスが正しいか確認します。

まずは、emailを指定して、ユーザー情報を取得します。

ts
signin: async (_:any, {email, password}: MutationUser, { prisma }: Context): Promise<UserPayload> => {
const user = await prisma.user.findUnique({
where: {
email
}
});
},

ユーザーが存在しない場合、エラーメッセージを返すようにします。

ts
signin: async (_:any, {email, password}: MutationUser, { prisma }: Context): Promise<UserPayload> => {
const user = await prisma.user.findUnique({
where: {
email
}
});
if(!user) {
return {
errors: [
{
message: "アカウント情報が間違っています"
}
],
user: null,
}
}
},

次に、パスワードが正しいかどうか確認します。

パスワードがハッシュ化されているので、bcryptcompareを使って確認します。

compare の第一引数に入力した password、第二引数にuserpasswordを指定します。

ts
signin: async (_:any, {email, password}: MutationUser, { prisma }: Context): Promise<UserPayload> => {
const user = await prisma.user.findUnique({
where: {
email
}
});
if(!user) {
return {
errors: [
{
message: "アカウント情報が間違っています"
}
],
user: null,
}
}
const comparePassword = await bcrypt.compare(password, user.password);
},

パスワードが間違っていれば、エラーメッセージを返すようにします。

ts
signin: async (_:any, {email, password}: MutationUser, { prisma }: Context): Promise<UserPayload> => {
const user = await prisma.user.findUnique({
where: {
email
}
});
if(!user) {
return {
errors: [
{
message: "アカウント情報が間違っています"
}
],
user: null,
}
}
const comparePassword = await bcrypt.compare(password, user.password);
if (!comparePassword) {
return {
errors: [
{
message: "パスワードが間違っています",
},
],
user: null,
};
}
},

emailpasswordが問題なければ、空のエラーメッセージとuserを返します。

では、ブラウザで確認しましょう。

GraphQL で、Signinmutationを作成します。

graphql
mutation Signin($email: String!, $password: String!) {
signin(email: $email, password: $password) {
errors {
message
}
user {
email
password
}
}
}

まずは、適当なemailpasswordを入力します。

image2

Signin ボタンをクリックすると、

image3

エラーメッセージが返ってきました。

次に、正しいemailと、適当なpasswordを入力します。

image4

Signin ボタンをクリックすると、

image5

こちらもエラーメッセージが返ってきました。

では、正しいemailと、適当なpasswordを入力します。

image6

Signin ボタンをクリックすると、

image7

正しい user 情報が返ってきました。

全文は、以下になります。

次回は、バックエンドで作成した GraphQL を、フロントエンドで接続します。

graphql-client-connect

【GraphQL】フロントエンドでGraphQLを接続する

© 2024あずきぱんウェブスタジオ