使用Nodejs 串接 Line API 並獲取Access Token
串line token 機制
下列為官方的說明
如果看不太懂官方說明我這邊稍微說明一下
curl -X POST https://api.line.me/oauth2/v2.1/token \
-H 'Content-Type: application/x-www-form-urlencoded' \
-d 'grant_type=authorization_code' \
-d 'code=xxx' \
-d 'redirect_uri=xxx' \
-d 'client_id=xxx' \
-d 'client_secret=xxx'
實際上是這四個步驟
那我們前後端要怎麼做呢?請往下看
因為今天只是要使用簡單的前端導向後端給後端處理
我們先建立簡單的React專案吧
我們可以依據React官方提供的建置步驟
在Command line下 (注意需要nodejs環境)
npx create-react-app bionic-netflix
cd bionic-netflix
npm start
覆蓋App.js
import React from 'react';
import logo from './logo.svg';
import './App.css';
function App() {
return (
<div className="App">
<header className="App-header">
<img src={logo} className="App-logo" alt="logo" />
<p>
Edit <code>src/App.js</code> and save to reload.
</p>
<a
className="App-link"
href="https://reactjs.org"
target="_blank"
rel="noopener noreferrer"
>
Learn React
</a>
<button onClick={(()=>{
// 注意這邊導向的Client 以及url須在官方設定
// 因為token要在後端處理會比較好所以callback_url我是給後端的並非前端喔
window.location.replace("https://access.line.me/oauth2/v2.1/authorize?response_type=code&client_id=請輸入你的ID&redirect_uri=http://localhost:3001/line/token&state=12345abcde&scope=openid%20profile&nonce=09876xyz") ;
}) }>test</button>
</header>
</div>
);
}
export default App;
!!注意
npm start
我們可以看到有一顆按鈕點下去就會導向Line的驗證畫面
接下來因為我要把token在後端處理 所以建立相關服務
這邊會用到的套件有
使用 npm install 把這些套件裝起來吧!!
const express = require("express");
const app = express();
const cors = require("cors");
var Client = require("node-rest-client").Client;
const jwt = require("jsonwebtoken");
var client = new Client();
const CLIENT_ID = 輸入你頻道的ID;
const CLIENT_SECRET = 輸入你的密碼;
app.use(cors());
const port = 3001;
app.get("/line/token", (req, res) => {
const query = req.query;
console.log(query);
var searchParams = new URLSearchParams();
searchParams.append("grant_type", "authorization_code");
searchParams.append("code", req.query.code);
searchParams.append("redirect_uri", "http://localhost:3001/line/token");
searchParams.append("client_id", CLIENT_ID);
searchParams.append("client_secret", CLIENT_SECRET);
var args = {
data: searchParams.toString(),
headers: { "Content-Type": "application/x-www-form-urlencoded" },
};
client.post("https://api.line.me/oauth2/v2.1/token", args, function (
data,
response
) {
console.log(data);
try {
var decoded = jwt.verify(data.id_token, CLIENT_SECRET);
} catch (err) {
// err
console.log(err);
}
client.get(
"https://api.line.me/v2/profile",
{ headers: { Authorization: `Bearer ${data.access_token}` } },
(data) => {
res.send({ profile: data, decoded });
}
);
});
});
app.listen(port, () => {
console.log(`Example app listening at http://localhost:${port}`);
});