# Firestore 사용자 인증

## Content

인증을 위해 **Firestore** REST API는 Firebase Authentication ID 토큰 또는 Google Identity OAuth 2.0 토큰 중 하나를 허용합니다.

* **Firebase ID 토큰**을 사용하는 경우, Firestore는 Cloud Firestore 보안 규칙을 사용하여 요청이 승인되었는지 판단합니다. 이 옵션은 Firestore Security Rules(더 유연하고 강력)을 활용하므로 **Snapshot** 클래스에서 지원하는 유일한 옵션이기 때문에 권장됩니다.
* **Google Identity OAuth 2.0 토큰**을 사용하는 경우, Firestore는 Cloud Identity와 Access Management (IAM)를 사용하여 요청이 승인되었는지 판단합니다. 이 옵션은 Firestore Security Rules을 우회하고 IAM 관리자가 부여한 권한을 사용합니다. 이는 **GoogleSheet** 클래스에서 사용하는 인증 방식과 유사합니다.


이번 예시에서 **Firebase ID** 토큰을 사용할 것입니다.

먼저 Firestore와 OAuth2 클래스를 가져와야 합니다:

```Javascript
import { Firestore, OAuth2 } from '@grapecity/wijmo.cloud';
```

그 다음, 생성한 Firebase ID 토큰을 사용하여 OAuth2 객체를 생성합니다:

```Javascript
const CLIENT_ID = '60621001861-h0u4ek4kmd3va9o2bubhq9ean0bgrhu2.apps.googleusercontent.com';
const SCOPES = [ 'https://www.googleapis.com/auth/userinfo.email' ];
let auth = new OAuth2(API_KEY, CLIENT_ID, SCOPES);

// button to log in/out
let oAuthBtn = document.getElementById('auth_btn');

// click button to log user in or out
oAuthBtn.addEventListener('click', () => {
    if (auth.user) {
        auth.signOut();
    } else {
        auth.signIn();
    }
});
```

인증을 완료하려면, 사용자가 변경될 때 **idToken** 을 **Firestore** 객체에 적용해야 합니다 (OAuth2 토큰을 사용할 경우 **accessToken** 속성을 설정하면 됩니다):

```Javascript
// update button/sheet state when user changes  
auth.userChanged.addHandler(s => {  
    let user = s.user;  

    // update button caption  
    oAuthBtn.textContent = user ? 'Sign Out' : 'Sign In';  

    // update Firestore ID token  
    fsNWind.idToken = user ? s.idToken : null;  
});
```