1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
| const jwt = require('jsonwebtoken');
const jwksClient = require('jwks-rsa');
const client = jwksClient({
jwksUri: 'https://accounts.google.com/.well-known/jwks.json',
cache: true,
rateLimit: true
});
function getSigningKey(header, callback) {
client.getSigningKey(header.kid, (err, key) => {
if (err) return callback(err);
callback(null, key.getPublicKey());
});
}
function verifyIdToken(idToken, expectedNonce) {
return new Promise((resolve, reject) => {
jwt.verify(idToken, getSigningKey, {
algorithms: ['RS256'],
issuer: 'https://accounts.google.com',
audience: process.env.OIDC_CLIENT_ID,
clockTolerance: 30 // 30秒の時刻ずれを許容
}, (err, decoded) => {
if (err) return reject(err);
// nonce の検証
if (decoded.nonce !== expectedNonce) {
return reject(new Error('nonce mismatch'));
}
resolve(decoded);
});
});
}
|