# 메서드

Wepin Login Library  초기화 이후 사용할 수 있습니다.

## loginWithOauthProvider

```javascript
await wepinLogin.loginWithOauthProvider(params)
```

새 창이 열리고 Wepin Firebase에 로그인합니다. 로그인에 성공하면 Firebase 로그인 정보를 반환합니다. `required/register_email`오류 메시지를 반환하면 `sendVerifyEmail` 메서드를 호출해야 합니다.

### **Parameters**

* `params` \<object>
  * `provider` <'google'|'naver'|'discord'|'apple'|'line'|'facebook'> - Provider for Firebase login
  * `withLogout` \<boolean> **optional**&#x20;
    * true : 이미 로그인 되어 있는 경우, 로그아웃을 하지 않음
    * false  : 이미 로그인 되어 있는 경우, 로그아웃을 하고 다시 로그인 함

### **Return value**

* `Promise` \<LoginResult | LoginErrorResult>
  * \<LoginResult>
    * `provider` <'google'|'naver'|'discord'|'apple'|'line'|'facebook'>
    * `token` \<object>
      * `idToken` \<string> \
        wepin firebase idToken
      * `refreshToken` \
        wepin firebase refreshToken
  * \<LoginErrorResult>
    * `error` \<string> \
      error message
    * `idToken` \<string> ***optional***\
      id token value
    * `accessToken` \<string> ***optional*** \
      accessToken token value
    * `provider` <'google'|'naver'|'discord'|'apple'|'line'|'facebook'> ***optional*** \
      Provider that issued the access token

### **Exception**

* `Invalid provider`:  파라미터인 프로바이더값이 잘못된 경우
* `User canceled` : 로그인 진행중에 사용자가 창을 닫은 경우
* `Internal error` : 나머지 예외 상황이 발생한 경우

### **Example**

```javascript
const user = await wepinLogin.loginWithOauthProvider(true)
```

* response
  * LoginResult

    ```json
    {
      "provider": "google",
      "token": {
          "idToken": "ab2231df....ad0f3291",
          "refreshToken": "eyJHGciO....adQssw5c",
      }
    }
    ```
  * LoginErrorResult

    ```json
    {
      "error": "required/register_email",
      "provider": "naver",
      "accessToken": "eyJHGciO....adQssw5c",
    }
    ```

## &#x20;signUpWithEmailAndPassWord

```javascript
await wepinLogin.signUpWithEmailAndPassword(email, password, openWepinWallet?)
```

이메일과 비밀번호로 Wepin Firebase에 회원가입을 합니다. 가입되지 않은 사용자의 경우 검증 이메일이 전송되며, `auth/email-verified`오류가 발생합니다. 이미 가입된 사용자의 경우, `auth/existed-email` 오류가 발생하며 [loginWithEmailAndPassword](#loginwithemailandpassword)를 호출하여 로그인 프로세스를 진행합니다. 로그인에 성공하면 Firebase 로그인 정보를 반환합니다.

### **Parameters**

* `email` \<string>\
  사용자 이메일 주소
* `password` \<string>

  사용자 이메일 비밀번호
* `openWepinWallet` \<boolean> **optional** \
  Wepin Wallet의 인증 이메일 전송 페이지가 보이게 할지 여부

### **Return Value**

* `Promise`\<LoginResult>
  * `provider` <'email'>
  * `token` \<object>
    * `idToken` \<string>\
      wepin firebase idToken
    * `refreshToken` \
      wepin firebase refreshToken

### **Exception**

* `auth/email-verified`: 회원가입을 위해 인증 이메일이 발송되었으며, 이메일 인증이 필요합니다.
* `auth/existed-email` : 이미 회원가입이 되어 있는 경우
* `fail/send-email` : 인증 이메일 발송에 실패한 경우
* `fail/email-verified` : 이메일 인증에 실패한 경우

### **Example**

```javascript
const user = await wepinLogin.signUpWithEmailAndPassword('abc@defg.com', 'abcdef123&')
```

* response

<pre class="language-json"><code class="lang-json"><strong>    {
</strong>        "provider": "email",
        "token": {
            "idToken": "ab2231df....ad0f3291",
            "refreshToken": "eyJHGciO....adQssw5c",
        }
    }
</code></pre>

## loginWithEmailAndPassWord

```javascript
await wepinLogin.loginWithEmailAndPassword(email, password)
```

이메일과 비밀번호로 Wepin Firebase에 로그인합니다. 로그인에 성공하면 Firebase 로그인 정보를 반환합니다.

### **Parameters**

* `email` \<string>\
  사용자 이메일 주소
* `password` \<string>

  사용자 이메일 비밀번호

### **Return Value**

* `Promise`\<LoginResult>
  * `provider` <'email'>
  * `token` \<object>
    * `idToken` \<string>\
      wepin firebase idToken
    * `refreshToken` \
      wepin firebase refreshToken

### **Example**

```javascript
const user = await wepinLogin.loginWithEmailAndPassword('abc@defg.com', 'abcdef123&')
```

* response

```json
    {
        "provider": "email",
        "token": {
            "idToken": "ab2231df....ad0f3291",
            "refreshToken": "eyJHGciO....adQssw5c",
        }
    }
```

## loginWithIdToken

```javascript
await wepinLogin.loginWithIdToken(params)
```

외부 IdToken으로 Wepin Firebase에 로그인합니다. 성공적으로 로그인하면 Firebase 로그인 정보를 반환합니다. `required/register_email`오류 메세지를 반환하면 `sendVerifyEmail` 메서드를 호출해야 합니다.

### **Parameters**

* `params` \<object>

  * `token` \<string> \
    로그인에 사용될 외부 IdToken 값입니다.
  * `sign` \<string> ***optional***

    첫 번째 매개변수로 제공된 `token`의 서명 값입니다. ([Signature Generation Methods](https://github.com/WepinWallet/wepin-widget-js-sdk/blob/main/doc/SignatureGenerationMethods.md))

  <div data-gb-custom-block data-tag="hint" data-style="warning" class="hint hint-warning"><p><code>@wepin/login-js</code> 버전 <mark style="color:red;"><strong>0.0.29</strong></mark> 부터 <code>sign</code> 값은 옵셔널로 변경되었습니다.<br><br><a href="https://workspace.wepin.io/">Wepin Workspace</a>에서 인증 키를 제거하면, 서명(<strong><code>sign</code></strong>)  값을 사용하지 않을 수 있습니다.</p><p>(<a href="https://workspace.wepin.io/">Wepin Workspace</a> > Development Tools menu > Login tab > Auth Key> Delete)</p><blockquote><p><mark style="background-color:yellow;">인증 키를 이전에 생성한 경우에만 인증 키 메뉴가 표시됩니다.</mark></p></blockquote></div>

### **Return Value**

* `Promise`\<LoginResult | LoginErrorResult>
  * \<LoginResult>
    * `provider` <'external\_token'>
    * `token` \<object>
      * `idToken` \<string> \
        wepin firebase idToken
      * `refreshToken` \
        wepin firebase refreshToken
  * \<LoginErrorResult>
    * `error` \<string>\
      error message
    * `idToken` \<string> ***optional*** \
      id token value

### **Example**

```javascript
const user = await wepinLogin.loginWithIdToken({
    token:'eyJHGciO....adQssw5c', 
    sign:'9753d4dc...c63466b9'
})
```

* response
  * LoginResult

    ```json
    {
      "provider": "external_token",
      "token": {
          "idToken": "ab2231df....ad0f3291",
          "refreshToken": "eyJHGciO....adQssw5c",
      }
    }
    ```
  * LoginErrorResult

    ```json
    {
      "error": "required/register_email",
      "idToken": "eyJHGciO....adQssw5c",
    }
    ```

## loginWithAccessToken

```javascript
await wepinLogin.loginWithAccessToken(params)
```

외부 Access Token으로 Wepin Firebase에 로그인합니다. 성공적으로 로그인하면 Firebase 로그인 정보를 반환합니다. `required/register_email`오류 메세지를 반환하면 `sendVerifyEmail` 메서드를 호출해야 합니다.

### **Parameters**

* `params` \<object>

  * `provider` <'naver'|'discord'|'facebook'>\
    Access Token을 발급 받은 로그인 Provider
  * `token` \<string> \
    로그인에 사용될 외부 Access Token값입니다.
  * `sign` \<string> ***optional***

    두 번째 매개변수로 제공된 `token`의 서명 값입니다. ([Signature Generation Methods](https://github.com/WepinWallet/wepin-widget-js-sdk/blob/main/doc/SignatureGenerationMethods.md))

  <div data-gb-custom-block data-tag="hint" data-style="warning" class="hint hint-warning"><p><code>@wepin/login-js</code> 버전 <mark style="color:red;"><strong>0.0.29</strong></mark> 부터 <code>sign</code> 값은 옵셔널로 변경되었습니다.<br><a href="https://workspace.wepin.io/">Wepin Workspace</a>에서 인증 키를 제거하면, 서명(<strong><code>sign</code></strong>)  값을 사용하지 않을 수 있습니다.</p><p>(<a href="https://workspace.wepin.io/">Wepin Workspace</a> > Development Tools menu > Login tab > Auth Key> Delete)</p><blockquote><p><mark style="background-color:yellow;">인증 키를 이전에 생성한 경우에만 인증 키 메뉴가 표시됩니다.</mark></p></blockquote></div>

### **Return Value**

* `Promise`\<LoginResult | LoginErrorResult>
  * \<LoginResult>
    * `provider` <'external\_token'>
    * `token` \<object>
      * `idToken` \<string>  \
        wepin firebase idToken
      * `refreshToken` \
        &#x20;wepin firebase refreshToken
  * \<LoginErrorResult>
    * `error` \<string> \
      error message
    * `accessToken` \<string> ***optional***\
      accessToken token value
    * `provider` \<string> ***optional*** \
      Provider that issued the access token

### **Example**

```javascript
const user = await wepinLogin.loginWithAccessToken({
    provider: 'naver', 
    token:'eyJHGciO....adQssw5c', 
    sign:'9753d4dc...c63466b9'
})
```

* response
  * LoginResult

    ```json
    {
      "provider": "external_token",
      "token": {
          "idToken": "ab2231df....ad0f3291",
          "refreshToken": "eyJHGciO....adQssw5c",
      }
    }
    ```
  * LoginErrorResult

    ```json
    {
      "error": "required/register_email",
      "provider": "naver",
      "accessToken": "eyJHGciO....adQssw5c",
    }
    ```

## getSignForLogin

```javascript
import {getSignForLogin} from '@wepin/login-js'
const result = getSignForLogin(privKey, message);
```

발행자를 검증하기 위한 서명을 생성합니다. 주로 IdToken 및 Access Token과 같은 로그인 관련 정보의 서명을 생성하는 데 사용됩니다.

### **Parameters**

* `privKey` \<string> \
  서명 생성에 사용되는 인증 키입니다.
* `message` \<string> \
  서명될 메세지 또는 페이로드입니다.

### **Return Value**

* \<string>

  서명값

{% hint style="danger" %}
인증 키(privKey)는 안전하게 보관해야 하며 외부에 노출되어서는 안 됩니다. 민감한 정보의 보안과 보호를 강화하기 위해 getSignForLogin() 메서드는 프론트 엔드가 아닌 백엔드에서 실행하는것을 권장합니다.
{% endhint %}

### **Example**

```javascript
const privKey = '0400112233445566778899001122334455667788990011223344556677889900'
const idToken = 'idtokenabcdef'
const sign = getSignForLogin(privKey, idToken)

const res = await wepinLogin.loginWithIdToken({
    token: idToken, 
    sign
})
```

## getRefreshFirebaseToken

```javascript
import {getRefreshFirebaseToken} from '@wepin/login-js'
const result = getSignForLogin(privKey, message);
```

Wepin에서 현재 Firebase 토큰의 정보를 가져옵니다.

### **Parameters**

* `prevFBToken` \<LoginResult> ***optional***
  * `provider` <'google'|'naver'|'discord'|'apple'|'line'|'facebook'>
  * `token` \<object>
    * `idToken` \<string> \
      wepin firebase idToken
    * `refreshToken` \
      wepin firebase refreshToken

{% hint style="warning" %}
`@wepin/login-js` version <mark style="color:red;">**0.0.33**</mark>부터`prevFBToken` 이 parameter 에 추가되었습니다.
{% endhint %}

### **Return Value**

* `Promise` \<LoginResult>
  * \<LoginResult>
    * `provider` <'google'|'naver'|'discord'|'apple'|'line'|'facebook'>
    * `token` \<object>
      * `idToken` \<string> \
        wepin firebase idToken
      * `refreshToken` \
        wepin firebase refreshToken

### **Example**

```javascript
// Without parameter (legacy way)
const result = await wepinLogin.getRefreshFirebaseToken()

// With prevFBToken parameter (since v0.0.33)
const prevToken = {
    provider: 'google',
    token: {
        idToken: 'previous_id_token',
        refreshToken: 'previous_refresh_token'
    }
}
const result = await wepinLogin.getRefreshFirebaseToken(prevToken)
```

## sendVerifyEmail

<pre class="language-javascript"><code class="lang-javascript"><strong>await wepinLogin.sendVerifyEmail(params)
</strong></code></pre>

sendVerifyEmail 메서드는 이메일 등록 및 이메일 인증 요청을 수행합니다. required/register\_email 오류가 발생한 경우, 이메일을 등록하고 인증을 요청해야 합니다. 인증이 완료되면 `loginWithAccessToken` 또는 `loginWithIdToken` 메서드를 사용하여 처음 로그인 시 사용했던 AccessToken 또는 IdToken으로 다시 로그인합니다.

### **Supported Version**

* 버전 <mark style="color:orange;">**`0.0.18`**</mark> 이상에서 지원

### **Parameters**

* `params` \<ISendVerifyEmailParams>
  * `email` \<string>\
    등록하고 인증할 이메일 주소
  * `provider` \<string> \
    Firebase 로그인 프로바이더. 소문자로 ‘google’, ‘naver’, ‘discord’, ‘apple’, ‘facebook’, ‘line’ 등의 지원되는 프로바이더 중 하나여야 합니다. 지원되는 로그인 프로바이더의전체 목록은 [Wepin Social Login Auth Provider](https://docs.wepin.io/login/social-login-auth-provider) 문서를 참조하세요.
  * `idToken` \<string> \
    로그인에 사용될 id token 값
  * `accessToken` \<string> \
    로그인에 사용될 access token 값

### **Return Value**

* Promise\<boolean>

### **Example**

```javascript
const res = await wepinLogin.sendVerifyEmail({
    email:'test@abcde.com'
    provider: 'naver', 
    accessToken:'eyJHGciO....adQssw5c', 
})
```

## loginWepin

<pre class="language-javascript"><code class="lang-javascript"><strong>await wepinLogin.loginWepin({provider, token})
</strong></code></pre>

지정된 Login Provider와 Token을 사용하여 사용자를 위핀에 로그인 합니다.

### **Parameters**

이  메서드의 파라미터는 해당 모듈내의 [loginWithOauthProvider()](#loginwithoauthprovider), [loginWithEmailAndPassword()](#loginwithemailandpassword), [loginWithIdToken()](#loginwithidtoken), 그리고 [loginWithAccessToken()](#loginwithaccesstoken) 메서드들로부터의 반환 값들을 활용해야 합니다.

* `provider` <'google'|'apple'|'naver'|'discord'|'line'|'facebook'|'external\_token'|'email'>\
  Login Provider
* `token` \<object>
  * `idToken` \<string>\
    wepin firebase idToken
  * `refreshToken` \
    wepin firebase refreshToken

### **Return Value**

* `Promise`\<IWepinUser>
  * `status` <'success'|'fail'>\
    로그인 결괏값
  * `userInfo` \<object> **optional**\
    로그인된 사용자의 정보
    * userId \<string>\
      사용자의 Wepin ID
    * email \<string>\
      사용자의 email 주소
    * provider<'google'|'apple'|'naver'|'discord'|'email'|'external\_token'>\
      로그인한 Provider
    * use2FA \<boolean>\
      사용자의 2FA 설정 여부
  * `userStatus` \<object>\
    로그인된 사용자의 상태정보
    * `loginStats`: <'complete' | 'pinRequired' | 'registerRequired'>\
      'complete'가 아닌 경우, 위핀에 회원가입(등록)을 해야됩니다.
    * `pinRequired` \<boolean> **optional**\
      사용자 PIN 번호의 필요 여부
  * `token` \<object>\
    사용자의 wepin token
    * `accessToken` \<string>\
      Wepin Access Token
    * `refreshToken` \
      Wepin Refresh Token

### **Example**

```javascript
const wepinLogin = WepinLogin({ appId: 'appId', appKey: 'appKey' })
const res = await wepinLogin.loginWithOauthProvider({ provider: 'google' })

const userInfo = await wepinLogin.loginWepin(res)
const userStatus = userInfo.userStatus
if(userStatus.loginStatus === 'pinRequired'||userStatus.loginStatus === 'registerRequired') {
    // wepin register
}
```

* response

```json
{
    "status": "success",
    "userInfo": {
      "userId": "120349034824234234",
      "email": "abc@gmail.com",
      "provider": "google",
      "use2FA": true,
    },
    "walletId": "abcdsfsf123",
    "userStatus": {
        "loginRequired": "completed",
        "pinRequired": false,
    },
    "token": {
        "accessToken": "",
        "refreshToken": "",
    }
}
```

## logout

```javascript
await wepinLogin.logout()
```

위핀 사용자를 로그아웃 합니다.&#x20;

### **Parameters**

* \<void>

### **Return Value**

* `Promise` \<boolean>

  성공인 경우 true

### **Exception**

* `Wepin login module Not initialized`: Wepin Login Library가 초기화 되지 않은 경우
* `Already logout` : 사용자가 이미 로그아웃된 상태인 경우우

### **Example**

```javascript
const result = await wepinLogin.logout()
```

## finalize

```javascript
wepinLogin.finalize()
```

Wepin Login Library 사용을 종료합니다.

### **Parameters**

* \<void>

### **Return Value**

* \<void>

### **Example**

```javascript
wepinLogin.finalize()
```
