即pyhton和java之后再来个nodejs的
依赖
npm install express axios express-session qs
代码
代码
const express = require('express');
const axios = require('axios');
const crypto = require('crypto');
const qs = require('qs');
const app = express();
const port = 8181;
// OAuth2 参数
const CLIENT_ID = 'hi3geJYfTotoiR5S62u3rh4W5tSeC5UG';
const CLIENT_SECRET = 'VMPBVoAfOB5ojkGXRDEtzvDhRLENHpaN';
const REDIRECT_URI = 'http://localhost:8181/oauth2/callback';
const AUTHORIZATION_ENDPOINT = 'https://connect.linux.do/oauth2/authorize';
const TOKEN_ENDPOINT = 'https://connect.linux.do/oauth2/token';
const USER_ENDPOINT = 'https://connect.linux.do/api/user';
app.use(express.json());
app.use(express.urlencoded({ extended: true }));
// 使用 session 来保存 state 和其他 OAuth2 相关信息
const session = require('express-session');
app.use(session({
secret: crypto.randomBytes(24).toString('hex'),
resave: false,
saveUninitialized: true
}));
app.get('/oauth2/initiate', (req, res) => {
req.session.oauthState = crypto.randomBytes(16).toString('hex');
const authorizationUrl = `${AUTHORIZATION_ENDPOINT}?client_id=${CLIENT_ID}&response_type=code&redirect_uri=${REDIRECT_URI}&state=${req.session.oauthState}`;
res.redirect(authorizationUrl);
});
app.get('/oauth2/callback', async (req, res) => {
const { code, state } = req.query;
if (state !== req.session.oauthState) {
console.error('State验证失败');
return res.status(401).send('State value does not match');
}
try {
const data = qs.stringify({
grant_type: 'authorization_code',
code: code,
redirect_uri: REDIRECT_URI
});
const tokenResponse = await axios.post(TOKEN_ENDPOINT, data, {
auth: {
username: CLIENT_ID,
password: CLIENT_SECRET
},
headers: { 'Content-Type': 'application/x-www-form-urlencoded' }
});
const userResponse = await axios.get(USER_ENDPOINT, {
headers: { 'Authorization': `Bearer ${tokenResponse.data.access_token}` }
});
console.log('User response:', userResponse.data);
res.json(userResponse.data);
} catch (error) {
console.error('Error during token fetch or user info retrieval:', error.message);
// 更详细地输出错误信息
if (error.response) {
console.error('Error response data:', error.response.data);
console.error('Error response status:', error.response.status);
console.error('Error response headers:', error.response.headers);
} else if (error.request) {
console.error('No response received:', error.request);
} else {
console.error('Error', error.message);
}
return res.status(500).send('Failed to fetch access token');
}
});
app.listen(port, () => {
console.log(`App listening at http://localhost:${port}`);
});
注意
代码为demo代码,实际请根据自己所需对token进行处理