Posted at

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

More than 1 year has passed since last update.

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