[Nuxt.js]Nuxt Googleログイン、NAVERログイン


Nuxtjsを使用してGoogleログインとNaverログインを実現しました.
フロントエンドのみを実装し,スプリングセキュリティを適用したバックエンドに関連付ける方法も検討する必要がある.
まずはネイバー登録の方が簡単なのでネイバー登録を書いておきましょう!

Nuxt.js+NAVERログイン


1.NAVERの作成者が作成したアプリケーションを登録する

로그인 후 -> Application -> 애플리케이션 등록 -> 사용 API : 네이버 로그인 -> 필요한 항목체크 -> 서비스 환경 각자에 맞게 설정 후(서비스 URL: 로그인으로 보내기 전 Url/ Callback URL: 네이버 로그인 성공후 돌아올 URL) -> 등록私の場合、次のurl設定を行いました.

2.Nuxtでのログインページの実装


1) pages/bonaem-mobile/account/index.vue
<template>
  <div>
    <Login />
  </div>
</template>

<script>
import Login from '@/components/bonaem-mobile/Account/Login'
export default {
  components: {
    Login
  }
}
</script>
2) components/bonaem-mobile/Account/Login.vue
<template>
	<img @click="loginWithNaver()" class="naver-btn" src="@/assets/login/naver_login.png">
</template>
<script>

export default {
  name: 'Login',
  methods: {
    loginWithNaver () {
      const naverLogin = new naver.LoginWithNaverId({
        clientId: '클라이언트 아이디',	//Application -> 내 애플리케이션 -> 개요 -> ClientId를 확인
        callbackUrl: `${window.location.origin}/naver-login`,
        callbackHandle: true
      })
      naverLogin.init()
      naverLogin.reprompt()
    }
  }
}
</script>
3) nuxt.config.jsはscriptに'https://static.nid.naver.com/js/naveridlogin_js_sdk_2.0.2.js'を追加
    script: [
      { src: 'https://static.nid.naver.com/js/naveridlogin_js_sdk_2.0.2.js' }
    ]
4) pages/naver-login/index.vue
<template>
  <section class="section">
      네이버 로그인 OK
  </section>
</template>

<script>
export default {
  name: 'Login',
  mounted () {
    const naverLogin = new naver.LoginWithNaverId({
      clientId: '클라이언트 아이디'
    })
    naverLogin.init()
    naverLogin.getLoginStatus(function(status) {
      if (status) {
        const info = {
          id: naverLogin.user.id,
          age: naverLogin.user.age,
          gender: naverLogin.user.gender,
          nickname: naverLogin.user.nickname,
          profile_image: naverLogin.user.profile_image,
        }

        console.log(naverLogin.user)
        console.log(naverLogin.accessToken)
      } else {
        console.log('AccessToken이 올바르지 않습니다.') 
      }
    })
  }
}
</script>

Nuxt.js+Googleログイン


Googleログインではgoogle-signin-vueライブラリを使用できますが、私はNAVERログインボタンとボタンを組み合わせて使用したいので、ライブラリのコードを直接変換しました.

1.まずはGoogleよよよボタンを使います。


**私にとってcallbackは/loginです.

2.Nuxtでのログインページの実装


1) components/bonaem-mobile/Account/Login.vue
<template>
    <img @click="loginWithNaver()" class="naver-btn" src="@/assets/login/naver_login.png">
</template>
<script>

export default {
  name: 'Login',
  mounted () {
    // google login
    window.__google_oauth_useful_variables = {
            client_id: '클라이언트아이디.apps.googleusercontent.com',
            warning: true,
            customButtonId: 'googleSignIn',
            attachSignin: this.attachSignin,
            onSignIn:this.onSignIn,
            onFailSignIn:this.onFailSignIn
        };
        gapi.load('auth2', function(){
            try {
                window.auth2 = gapi.auth2.init({
                    client_id: window.__google_oauth_useful_variables.client_id,
                    cookiepolicy: 'single_host_origin',
                });
            }catch (e) {
                window.__google_oauth_useful_variables.warning ? console.warn(e):null;
            }
            try {
                if (window.__google_oauth_useful_variables.customButtonId){
                    window.__google_oauth_useful_variables.attachSignin(document.getElementById(window.__google_oauth_useful_variables.customButtonId));
                }
            }catch (e) {
                window.__google_oauth_useful_variables.warning ? console.warn(e):null;
            }
        });

        if(!this.customButton) {
            gapi.signin2.render('googleSignIn', {
                scope: this.scope,
                width: this.width,
                height: this.height,
                longTitle: this.longTitle,
                theme: this.theme,
                onsuccess: this.onSignIn,
                onfailure: this.onFailSignIn
            });
        }
      this.validate();
  },
 methods: {
    validate () {
        if(typeof this.successCallBack === "undefined")
          this.warning ? console.warn("Google Sign In --> Specify the success callback method to get the data") : null;
        else if(typeof this.successCallBack !== "function")
          this.warning ? console.warn("Google Sign In --> Success Callback must be a valid Function") : null;
        if(typeof this.failureCallBack === "undefined")
          this.warning ? console.warn("Google Sign In --> Specify the Failure callback method to get the Error data") : null;
        else if(typeof this.failureCallBack !== "function")
          this.warning ? console.warn("Google Sign In --> Failure Callback must be a valid Function") : null;
        if(this.customButton) {
            if(typeof this.customButtonId === 'undefined')
                this.warning ? console.warn("Google Sign In --> Please Provide customButtonId or change the customButton to false") : null;

        }
      },
    attachSignin (element) {
            window.auth2.attachClickHandler(element, {},
                function(googleUser) {
                    window.__google_oauth_useful_variables.onSignIn(googleUser);
                }, function(error) {
                    window.__google_oauth_useful_variables.onFailSignIn(error);
                }
            );
        },
    onSignIn (googleUser) {
        let id_token = googleUser.getAuthResponse().id_token;
        let profile = googleUser.getBasicProfile();
        if (typeof this.successCallBack === "function") {
          const user = {
            id_token,
            id: profile.getId() ? profile.getId() : null,
            name: profile.getName() ? profile.getName() : null,
            image: profile.getImageUrl() ? profile.getImageUrl() : null,
            email: profile.getEmail() ? profile.getEmail() : null
          }
          this.successCallBack(user);
        }
      },
      onFailSignIn (error) {
        if (typeof this.failureCallBack === "function")
          this.failureCallBack(error);
      },

    successCallBack (user) {
      console.log(user)
    },
    failureCallBack (errorData) {
      console.log(errorData)
    },
  }
}
</script>
2) nuxt.config.jsはscriptに'https://apis.google.com/js/platform.js'を追加
    script: [
      { src: 'https://apis.google.com/js/platform.js' }
    ]

ここまではNuxtjs+(NAVERログイン、Googleログイン).
後で、追加または変更が必要な部分があれば、追加します!
修正が必要な箇所があれば、コメントにフィードバックしてください:)
ブログ1参照
参考ブログ2