私のフロントエンドアプリケーションは、Gmailアカウントを使用して認証されています。
認証が成功した後、id_tokenを取得し、認証ヘッダーとして送信しますasベアラートークン。
例えば。 http:// localhost:4000/api
承認ベアラtoken_id
nodejsサーバー側で、次のメソッドを呼び出してトークンを検証します。
exports.verifyUser = function(req, res, next) {
var GoogleAuth = require('google-auth-library');
var auth = new GoogleAuth();
var client = new auth.OAuth2(config.passport.google.clientID, config.passport.google.clientSecret, config.passport.google.callbackURL);
// check header or url parameters or post parameters for token
var token = "";
var tokenHeader = req.headers["authorization"];
var items = tokenHeader.split(/[ ]+/);
if (items.length > 1 && items[0].trim().toLowerCase() == "bearer") {
token = items[1];
}
if (token) {
var verifyToken = new Promise(function(resolve, reject) {
client.verifyIdToken(
token,
config.passport.google.clientID,
function(e, login) {
console.log(e);
if (login) {
var payload = login.getPayload();
var googleId = payload['sub'];
resolve(googleId);
next();
} else {
reject("invalid token");
}
}
)
}).then(function(googleId) {
res.send(googleId);
}).catch(function(err) {
res.send(err);
})
} else {
res.send("Please pass token");
}
}
上記のメソッドを呼び出すと、常に無効なトークン応答が返され、次のエラーが発生します。
Error: No pem found for envelope: {"alg":"RS256","kid":"c1ab5857066442ea01a01601
850770676460a712"}
at OAuth2Client.verifySignedJwtWithCerts (\node_modules\google-auth-libr
ary\lib\auth\oauth2client.js:518:13)
どんな助けでも大歓迎です。
OAuth2Client.verifyIdToken
ライブラリソース から引数にidTokenを取ります:
/**
* Verify id token is token by checking the certs and audience
* @param {string} idToken ID Token.
* @param {(string|Array.<string>)} audience The audience to verify against the ID Token
* @param {function=} callback Callback supplying GoogleLogin if successful
*/
OAuth2Client.prototype.verifyIdToken = function(idToken, audience, callback)
ヘッダー値全体bearer eyJhbGciOiJSUzI1NiIsImtpZCI6ImMxYWI1OD U3MDY2NDQyZWEwMWEwMTYwMTg1MDc3MDY3NjQ2MGE3MTIifQ
を渡したので、ヘッダー値を次のように分割する必要があります。
var authorization = req.headers["authorization"];
var items = authorization.split(/[ ]+/);
if (items.length > 1 && items[0].trim() == "Bearer") {
var token = items[1];
console.log(token);
// verify token
}
これはトークンを検証するための正しいアプローチですか?
はい、これはトークンを確認する正しい方法です。デバッグのために、疑問がある場合や迅速なテストのために、tokeninfoエンドポイントでトークンを検証することもできます。
https://www.googleapis.com/oauth2/v3/tokeninfo?id_token=XYZ123
- Id_tokenを承認ベアラーとして送信しますか?それとも承認のみですか?
- Id_tokenをサーバー側に送信するにはどうすればよいですか? URL、ヘッダーを介して?
AuthorizationヘッダーでJWTトークンを送信できますが、 複数のAuthorizationヘッダー があるユースケースにつながる可能性があります。トークンをURLエンコードするか、本文に埋め込むことをお勧めします。あなたはグーグルの例をチェックすることができます ここ
さらに、Googleでは以下が必要です。
コードを最適化するために、トークンを検証するたびに再定義する代わりに、Google auth
オブジェクトをアプリのルートにあるapp.js
に移動することもできます。 app.js
で:
var app = express();
var GoogleAuth = require('google-auth-library');
var auth = new GoogleAuth();
app.authClient = new auth.OAuth2(config.passport.google.clientID, config.passport.google.clientSecret, config.passport.google.callbackURL);
verifyUser
でreq.app.authClient
から呼び出します:
req.app.authClient.verifyIdToken(...)