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