JavaScript
Node.js
WebAPI
Line
LineLogin

Node.jsでLINEログインするコードを書いてみた

ITリテラシー低い人たち用にアカウント作成の敷居を下げたくて、LINEログイン使えないかなーと試してみた。
結論から言うとWebアプリの場合、結局メールアドレスとパスワードを入れる必要があるので微妙。

いつか使うかもしれないのでメモだけしとく。IDトークン取得しない版。
まったくエラーハンドリングしてないので実際に使うときはちゃんと入れること。

login.js
const express = require('express');
const router = express.Router();

const request = require('request');
const co = require('co');

const base_uri = 'https://xxxxx';
const client_id = '9999999999';
const client_secret = 'abcdefg0123456789abcdefghijklmno';

function getUUID() {
  const l = 8;
  const c = "abcdefghijklmnopqrstuvwxyz0123456789";
  const cl = c.length;
  let r = "";
  for(let i=0; i<l; i++) {
    r += c[Math.floor(Math.random()*cl)];
  }
  return r;
}

function getToken(params) {
  return new Promise((resolve, reject) => {
    request.post(params, (error, response, body) => {
      if(error) {
        reject(error);
      } else {
        resolve(body);
      }
    });
  });
} 

router.get('/', function(req, res, next) {
  const rParams = req.query;

  if(rParams.code) {
    // 認可コード取得のコールバックでここに来る
    co(function*() {
      const auth = {
        code: rParams.code,
        state: rParams.state,
      };

      // アクセストークン取得
      const token = yield getToken({
        uri: 'https://api.line.me/oauth2/v2.1/token',
        form: {
          grant_type: 'authorization_code',
          code: auth.code,
          redirect_uri: base_uri,
          client_id: client_id,
          client_secret: client_secret,
        },
        json: true,
      });

      res.send(token);

    });
  } else if(rParams.access_token) {
    // アクセストークン取得後のコールバックでここに来る

    res.send(rParams);

  } else {
    // 初回アクセス時はここに来る

    const url = 'https://access.line.me/oauth2/v2.1/authorize';
    const sParams = [
      'response_type=code',
      `client_id=${client_id}`,
      `redirect_uri=${base_uri}`,
      `state=${getUUID()}`,
      'scope=profile',
      'nonce=my%20app',
    ];

    // 認証画面へリダイレクト(認可コード取得)
    res.redirect(`${url}?${sParams.join('&')}`);

  }

});

module.exports = router;

UUID取得はこちらを使わせていただきました。
https://qiita.com/ryounagaoka/items/4736c225bdd86a74d59c