NFTPLUS+ Document
  • はじめに
  • NFTPLUSの提供サービスについて
    • NFTPLUSのAPIについて
    • NFTPLUS Authについて
      • 登録申請
      • 認証フロー
      • 1. メッセージ署名によるログイン
        • API
        • NFTPLUS 認証画面
      • 2. トークン取得
        • API
      • 3. ID Tokenによるユーザーの検証
        • API
      • 4. Userinfo
        • API
        • 電話番号認証
          • NFTPLUS 共通画面
        • 居住国登録
        • マジックリンク(QR)ログイン機能について
          • NFTPLUS共通認証画面
    • NFTPLUS Torusについて
      • 申し込み方法および精算について
      • 参考認証画面&ソースコード
  • ソース等の提供について
    • ゲームエンジンソース
    • 在庫連動型ダッチオークション
    • コンバートについて
    • NFTPLUS パートナータイトルのAPIについて
  • LINKS
    • NFTPLUS 公式サイト
    • NFTPLUS 公式Twitter
    • NFTPLUS 公式Twitter(英語版)
    • Contact
Powered by GitBook
On this page
  1. NFTPLUSの提供サービスについて
  2. NFTPLUS Authについて
  3. 1. メッセージ署名によるログイン

NFTPLUS 認証画面

PreviousAPINext2. トークン取得

Last updated 3 years ago

ログインフローは自前で実装することが可能です。JavaScript

NFTPLUSで用意した共通画面を利用することができます。

Nuxt.jsの場合、以下のようなPluginを作成することで簡単に共通画面を利用できます。

import Cookies from 'universal-cookie'
import axios from 'axios'
import crypto from 'crypto'

let URLSearchParams
let atob
export default ({ app }, inject) => {
  const cookies = new Cookies()
  if (process.server) {
    URLSearchParams = require('url').URLSearchParams
    atob = base64 => new Buffer(base64, 'base64').toString('binary')
  } else {
    URLSearchParams = window.URLSearchParams
    atob = base64 => window.atob(base64)
  }

  const auth = app.$env.auth
  auth.state = () => {
    const state = Math.floor(Math.random() * 100000)
    cookies.set('mchplus_auth_state', state, { maxAge: 600 })
    return state
  }

  auth.authorizeLink = lang => {
    const params = new URLSearchParams()
    params.append('response_type', 'code')
    params.append('client_id', auth.clientId)
    params.append('state', auth.state())
    params.append('redirect_url', auth.redirectUri)
    params.append('lang', lang)
    params.append('scope', 'openid profile')
    return auth.authUri + '?' + params.toString()
  }

  auth.phoneLink = lang => {
    const params = new URLSearchParams()
    params.append('lang', lang)
    params.append('client_id', auth.clientId)
    params.append('redirect_url', auth.phoneRedirectUri)
    return auth.phoneUri + '?' + params.toString()
  }

  auth.OpenAuthWindow = lang => {
    window.open(
      auth.authorizeLink(lang),
      'plsauth',
      'resizable=no,width=400,height=600'
    )
  }

  auth.OpenPhoneVerifyWindow = lang => {
    window.open(
      auth.phoneLink(lang),
      'phoneauth',
      'resizable=no,width=400,height=600'
      )
  }

  auth.getToken = async params => {
    if (cookies.get('mchplus_auth_state') != params.state) {
      console.error('state error')
    }
    const data = new URLSearchParams()
    data.append('grant_type', 'authorization_code')
    data.append('code', params.code)
    data.append('redirect_uri', auth.redirectUri)
    data.append('client_id', auth.clientId)
    data.append('client_secret', auth.clientSecret)
    const ret = await axios.post(auth.tokenUri, data)
    return ret.data
  }

  auth.HMAC_SHA256 = (key, data) => {
    const hash = crypto
      .createHmac('sha256', key)
      .update(data)
      .digest('base64')
    const hashNoPadding = hash.replace(/={1,2}$/, '')
    return hashNoPadding
  }

  auth.parseJwt = token => {
    const base64Url = token.split('.')[1]
    const base64 = base64Url.replace('-', '+').replace('_', '/')
    return JSON.parse(atob(base64))
  }

  inject('mchplusAuth', auth)
}

ログイン前ページで、

this.$mchplusAuth.OpenAuthWindow("ja");

と呼び出すと子Windowで認証画面が開きます。

SDK