본문 바로가기
C#/Firebase

C# : Firebase 사용하기 - 07 (Firebase 회원가입, 로그인)

by Half-Dev 2021. 3. 4.

안녕하세요.

하프개발자 입니다.

이번에는 Firebase 회원가입에 대해서 알아보도록 하겠습니다.

 


Part 1. 회원가입 디자인

저는 회원가입을 간단하게 만들어봤습니다.

 

회원가입을 하기 위해서는 입력된 정보가 이미 있는지 확인해볼 수 있는 검색기능

회원을 추가할 수 있는 추가기능이 필요하겠습니다.

 

 

Part 2. 회원가입 

 

회원가입을 위해서 Firebase의 Join이라는 컬렉션과 Admin문서 Id, Pass필드를 생성해 줍니다.

 

다음으로 코드를 작성해주도록 하겠습니다.

아래의 코드는 Id의 중복이 있는지의 여부를 판단할 수 있도록 제작이 되어 있고

button1_Click 이벤트기준으로 봐주시면 되겠습니다.

 

우선 11줄의Management라는 메소드를 기준으로 실행이 됩니다.

그런 후 17줄에서의 FindId의 메서드를 사용해 해당 Id가 있는지 확인을 한 후

18, 19줄 에서 회원가입의 여부를 판단합니다.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
private void button1_Click(object sender, EventArgs e)
{
    string id = textBox1.Text;
    string pass = textBox2.Text;
 
    if (id == "" || pass == ""//공백이 입력될 경우
    {
        MessageBox.Show("아이디 또는 비밀번호에 공백이 있습니다.");
        return;
    }
    Management(id, pass);
           
}
 
private async void Management(string id, string pass)
{
    bool idCheck = await FindId(id);
    if(idCheck) {} //id가 이미 있으므로 회원가입 X
    else if(!idCheck) //id가 없으므로 회원가입 O
    {
    }
}
 
async Task<bool> FindId(string id)
{
    Query qref = db.Collection("Join").WhereEqualTo("Id", id);
    QuerySnapshot snap = await qref.GetSnapshotAsync();
 
    foreach (DocumentSnapshot docsnap in snap)
    {
        if (docsnap.Exists)
        {
            return true;
        }
    }
    return false;
}
cs

 

 

아이디의 확인을 했으니 이제 등록을 해보도록 하겠습니다.

수정할 부분추가할 부분을 정리해놓았으니 한번 보시면 되겠습니다.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
//수정할 부분
private async void Management(string id, string pass)
{
    bool idCheck = await FindId(id);
    if(idCheck) {} //id가 이미 있으므로 회원가입 X
    else if(!idCheck) //id가 없으므로 회원가입 O
    {
        Join(id, pass);
        MessageBox.Show("회원가입이 완료되었습니다.");
    }
}
 
//추가할 부분
void Join(string id, string pass)
{
    DocumentReference DOC = db.Collection("Join").Document();
    Dictionary<stringobject> data1 = new Dictionary<stringobject>()
    {
        {"Id", id },
        {"Pass", pass },
    };
    DOC.SetAsync(data1);
}
cs


Part 3. 로그인 

 

로그인 기능을 만들기 위해서는 이또한 검색기능이 필요하겠습니다.

로그인 기능은 회원가입 기능에서 살짝만 변형시키면 되기 때문에 코드를 보고 이해하기는게 더 좋을 것 같습니다.

주석또한 달아놓았으니 확인해보시면 될 듯 합니다.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
//추가할 부분
//로그인 버튼 이벤트
private void button2_Click(object sender, EventArgs e)
{
    string id = textBox1.Text;
    string pass = textBox2.Text;
 
    if (id == "" || pass == ""//공백이 입력될 경우
    {
        MessageBox.Show("아이디 또는 비밀번호에 공백이 있습니다.");
        return;
    }
 
    LoginManagement(id, pass);
}
 
//추가할 부분
//로그인 관리
private async void LoginManagement(string id, string pass)
{
    bool idCheck = await FindId(id, pass);
    if(idCheck) //id, pass 일치
    {
        MessageBox.Show("로그인 되었습니다.");
    } else if(!idCheck) //id, pass 일치하지 않음
    {
        MessageBox.Show("로그인에 실패하였습니다.");
    }
}
 
//추가할 부분
//아이디, 비번 찾는 메서드
async Task<bool> FindId(string id, string pass)
{
    Query qref = db.Collection("Join").WhereEqualTo("Id", id).WhereEqualTo("Pass", pass);
    QuerySnapshot snap = await qref.GetSnapshotAsync();
 
    foreach (DocumentSnapshot docsnap in snap)
    {
        if (docsnap.Exists)
        {
            return true;
        }
    }
    return false;
}
 
cs

 

 


위의 코드들을 보게 되면, FindId 메소드가 2개가 됩니다.

FindId(string id)

FindId(string id, pass)

 

이렇게 이름은 같지만 매개변수의 타입, 개수가 달라도 동작하는것을 메소드 오버로딩 이라고 하니 알아두시면 좋으실듯 합니다.


제가 준비한 내용은 여기까지 입니다.

다음글에서 뵙도록 하겠습니다.

감사합니다.

 

해당 코드는 저의 깃허브에서도 볼 수 있습니다.

전체 코드
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
using System;
using System.Collections;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using Google.Cloud.Firestore;
 
namespace CsFirebaseBlog
{
    public partial class Form1 : Form
    {
        FirestoreDb db;
        public Form1()
        {
            InitializeComponent();
        }
 
        //초기화
        private void Form1_Load(object sender, EventArgs e)
        {  
            string path = AppDomain.CurrentDomain.BaseDirectory + @"cs-firebase-blog-firebase-adminsdk-18cwe-b5971a4787.json";
            Environment.SetEnvironmentVariable("GOOGLE_APPLICATION_CREDENTIALS", path);
 
            db = FirestoreDb.Create("cs-firebase-blog");
        }
 
 
        //회원가입 버튼 이벤트
        private void button1_Click(object sender, EventArgs e)
        {
            string id = textBox1.Text;
            string pass = textBox2.Text;
 
            if (id == "" || pass == ""//공백이 입력될 경우
            {
                MessageBox.Show("아이디 또는 비밀번호에 공백이 있습니다.");
                return;
            }
            JoinManagement(id, pass);
           
        }
 
        //로그인 버튼 이벤트
        private void button2_Click(object sender, EventArgs e)
        {
            string id = textBox1.Text;
            string pass = textBox2.Text;
 
            if (id == "" || pass == ""//공백이 입력될 경우
            {
                MessageBox.Show("아이디 또는 비밀번호에 공백이 있습니다.");
                return;
            }
 
            LoginManagement(id, pass);
        }
 
        //회원가입 관리
        private async void JoinManagement(string id, string pass)
        {
            bool idCheck = await FindId(id);
            if(idCheck) {} //id가 이미 있으므로 회원가입 X
            else if(!idCheck) //id가 없으므로 회원가입 O
            {
                Join(id, pass);
                MessageBox.Show("회원가입이 완료되었습니다.");
            }
        }
 
        //로그인 관리
        private async void LoginManagement(string id, string pass)
        {
            bool idCheck = await FindId(id, pass);
            if(idCheck) //id, pass 일치
            {
                MessageBox.Show("로그인 되었습니다.");
            } else if(!idCheck) //id, pass 일치하지 않음
            {
                MessageBox.Show("로그인에 실패하였습니다.");
            }
        }
 
        //아이디 찾는 메서드
        async Task<bool> FindId(string id)
        {
            Query qref = db.Collection("Join").WhereEqualTo("Id", id);
            QuerySnapshot snap = await qref.GetSnapshotAsync();
 
            foreach (DocumentSnapshot docsnap in snap)
            {
                if (docsnap.Exists)
                {
                    return true;
                }
            }
            return false;
        }
 
        //아이디, 비번 찾는 메서드
        async Task<bool> FindId(string id, string pass)
        {
            Query qref = db.Collection("Join").WhereEqualTo("Id", id).WhereEqualTo("Pass", pass);
            QuerySnapshot snap = await qref.GetSnapshotAsync();
 
            foreach (DocumentSnapshot docsnap in snap)
            {
                if (docsnap.Exists)
                {
                    return true;
                }
            }
            return false;
        }
 
        //가입하는 메서드
        void Join(string id, string pass)
        {
            DocumentReference DOC = db.Collection("Join").Document();
            Dictionary<stringobject> data1 = new Dictionary<stringobject>()
            {
                {"Id", id },
                {"Pass", pass },
            };
            DOC.SetAsync(data1);
        }
 
    }
}
 
 
cs

댓글