Auth０で簡単にユーザー認証を実装（花粉カレンダー作成②）

##概要

耳鼻咽喉科の開業医をしています。
花粉症の患者さんに使ってもらえるような花粉飛散情報が分かるカレンダーアプリを作りたいと思っています。
前回カレンダーを表示して予定を入れるところまで挑戦してみました。
[Vue.js×FullCallendarでカレンダー作成（花粉カレンダー作成①）](https://qiita.com/doikatsuyuki/items/344b61459977a7ee2eff)

今回はユーザー個別のカレンダーを表示するために、ユーザー認証機能の実装に挑戦しました。

##完成動画
https://youtu.be/koMpYAiKE2k

##作成
こちらの記事を参考にさせていただきました。ありがとうございました。
[Auth0 + GitHub Pagesでミニマムなログインサンプルを作る](https://protoout.studio/posts/auth0-github-pages)
[ファイル一つコピペで試すAuth0+Vue.jsのログインサンプル](https://qiita.com/n0bisuke/items/7de00908acc7854e79af?fbclid=IwAR1K3-B9Bj2ZEdh1_25nKlpS_pMqltd5Wk_saAV033rG9tiHK_AXd_3_RKk)

**1. Auth0のアカウント作成・サインイン**
こちらから行ってください。
[Auth0ホームページ](https://auth0.com/jp/)

**2.アプリケーションの作成**
[Applications]>[Settings]のタブに移動し、
Allowed Callback URLs、Allowed Logout URLsを以下に設定します。
http://localhost:8080/#/calendar
Allowed Web Origins、Allowed Origins (CORS)を以下に設定します。
http://localhost:8080
DomainとClient IDは後で使うのでひかえておきます。

<img width="952" alt="2020-01-18_10h10_54.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/453374/52a6c3af-0ced-ec20-cacb-7aa23ad9092e.png">

**3.ユーザー認証の実装**
以前作成したCalendar.vueに書き込んでいきます。
[Vue.js×FullCallendarでWEBカレンダー作成（花粉カレンダー作成①）](https://qiita.com/doikatsuyuki/items/344b61459977a7ee2eff)

templateタグの中に以下を追加していきます。

```vue
<button id="btn-login" v-on:click="auth0login()">Log in</button>
        <button id="btn-logout" v-on:click="auth0logout()">Log out</button>

        <div v-if="login" id="gated-content">
          <p>
            You're seeing this content because you're currently
          </p>
          <label>
              User profile Image:
              <img :src="userData.picture" id="ipt-user-profile-image" width="200px">
              <br />
          </label>
          <label>
            User profile:
            <pre id="ipt-user-profile">{{userData}}</pre>
          </label>

          <label>
            Access token: 
            <pre id="ipt-access-token">{{userData.token}}</pre> 
          </label>      
        </div>
```

ログイン後にカレンダーが表示されるようにします。

```vue
 <div v-if="login">
        <FullCalendar 
    default-view="dayGridMonth"
    :locale="locale"
    :header="calendarHeader"
    :weekends="calendarWeekends"
    :plugins="calendarPlugins"
    :events="calendarEvents"
    @dateClick="handleDateClick"
  />
  </div>
```

scriptタグの内に以下を書き込んでいきます。


```js
import createAuth0Client from '@auth0/auth0-spa-js';
```
data(){ }の中に以下を追記します。

```js

data() {
    return {
      auth0:{},
      APP_PATH:'/#/calendar',
      userData:{},
      login:false,
    }
}
```

methods: { }の中に以下を追記します。

```js
async updateUI(){
        const isAuthenticated = await this.auth0.isAuthenticated();
        if (isAuthenticated) {
            this.login = true; //ログイン後の情報が表示
            this.userData = await this.auth0.getUser();
            this.userData.token = await this.auth0.getTokenSilently();
        }
    },
    async auth0login(){
        await this.auth0.loginWithRedirect({
            redirect_uri: window.location.origin + this.APP_PATH
        });
    },
    auth0logout(){
        this.auth0.logout({
            returnTo: window.location.origin + this.APP_PATH
        });
    },
```

最後にこちらを追記して完了です。

```js
async created() {
    this.auth0 = await createAuth0Client({
      domain: 'domain名を記載',
      client_id: 'client_idを記載',
      // redirect_uri: '<MY_CALLBACK_URL>'
    });
    this.updateUI();
    const isAuthenticated = await this.auth0.isAuthenticated();    
    if (isAuthenticated) {
        return;
    }
    const query = window.location.search;
    if (query.includes("code=") && query.includes("state=")) {

        // Process the login state
        await this.auth0.handleRedirectCallback();

        this.updateUI();

        // Use replaceState to redirect the user away and remove the querystring parameters
        window.history.replaceState({}, document.title, this.APP_PATH);
    }
}
```
Auth0でユーザー認証を入れたいところをONにします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/453374/5e7e45ea-be3b-4bdc-1e81-c0cc259f5468.png)


**考察**
最初は参考記事のコピペで出来るかな？と軽く考えていました。しかし、vue.jsを全く勉強していなかったのですこし時間がかかってしまいました。追記する場所が分かればこれだけで面倒なユーザー認証が実装できるので便利ですね。