web-dev-qa-db-ja.com

クライアント側から受け取ったGoogle認証コードを使用してサーバー側のJavaScript(nodejs)でアクセストークンを取得する

私はこのドキュメントを読みました:- https://developers.google.com/identity/sign-in/web/server-side-flow

最後のステップで認証コードを受信し、その後、Javaまたはpythonライブラリを使用してアクセストークンと更新トークンを受信する例を示していますが、できません。 nodejsで同様の例を見つけます。nodejsを使用して同じ例を複製するにはどうすればよいですか?投稿または取得リクエストをいくつかのgoogle oauth apiに送信し、認証コードを使用してアクセストークンを受信することはできません。 ?

前もって感謝します :)

9
Nishan

Google APIs Node.js Client ライブラリは oauth2Client.getToken(code, cb) を提供し、認証コードの代わりにアクセストークン(およびオプションで更新トークン)を提供します。

oauth2Client.getToken(code, function (err, tokens) {
  // Now tokens contains an access_token and an optional refresh_token. Save them.
  if (!err) {
    oauth2Client.setCredentials(tokens);
  }
});

公式な例は https://github.com/google/google-api-nodejs-client/tree/master/samples にあり、これには oauth2.js 、oauthパートのヘルパー

完全な例は、Paul Shanの this site でも確認できます。これは Google APIs Node.js Client を使用したnodejsの例です。 ClientIdClientSecretを編集し、このサンプルを実行して http://127.0.0.1:8081 に移動します

var http = require('http');
var express = require('express');
var Session = require('express-session');
var google = require('googleapis');
var plus = google.plus('v1');
var OAuth2 = google.auth.OAuth2;
const ClientId = "YOUR_CLIENT_ID";
const ClientSecret = "YOUR_CLIENT_SECRET";
const RedirectionUrl = "http://localhost:8081/oauthCallback";

var app = express();
app.use(Session({
    secret: 'raysources-secret-19890913007',
    resave: true,
    saveUninitialized: true
}));

function getOAuthClient() {
    return new OAuth2(ClientId, ClientSecret, RedirectionUrl);
}

function getAuthUrl() {
    var oauth2Client = getOAuthClient();
    // generate a url that asks permissions for Google+ and Google Calendar scopes
    var scopes = [
        'https://www.googleapis.com/auth/plus.me'
    ];

    var url = oauth2Client.generateAuthUrl({
        access_type: 'offline',
        scope: scopes,
        //use this below to force approval (will generate refresh_token)
        //approval_Prompt : 'force'
    });

    return url;
}

app.use("/oauthCallback", function(req, res) {
    var oauth2Client = getOAuthClient();
    var session = req.session;
    var code = req.query.code;
    oauth2Client.getToken(code, function(err, tokens) {
        console.log("tokens : ", tokens);
        // Now tokens contains an access_token and an optional refresh_token. Save them.
        if (!err) {
            oauth2Client.setCredentials(tokens);
            session["tokens"] = tokens;
            res.send(`
                <html>
                <body>
                    <h3>Login successful!!</h3>
                    <a href="/details">Go to details page</a>
                <body>
                <html>
            `);
        } else {
            res.send(`
                <html>
                <body>
                    <h3>Login failed!!</h3>
                </body>
                </html>
            `);
        }
    });
});

app.use("/details", function(req, res) {
    var oauth2Client = getOAuthClient();
    oauth2Client.setCredentials(req.session["tokens"]);

    var p = new Promise(function(resolve, reject) {
        plus.people.get({ userId: 'me', auth: oauth2Client }, function(err, response) {
            console.log("response : ", response);
            resolve(response || err);
        });
    }).then(function(data) {
        res.send(`<html><body>
            <img src=${data.image.url} />
            <h3>Hello ${data.displayName}</h3>
            </body>
            </html>
        `);
    })
});

app.use("/", function(req, res) {
    var url = getAuthUrl();
    res.send(`
        <html>
        <body>
<h1>Authentication using google oAuth</h1>
        <a href=${url}>Login</a>
        </body>
        </html>
    `)
});


var port = 8081;
var server = http.createServer(app);
server.listen(port);
server.on('listening', function() {
    console.log(`listening to ${port}`);
});
7
Bertrand Martel