使用从客户端收到的谷歌授权码在服务器端 javascript (nodejs) 上获取访问令牌

Posted

技术标签:

【中文标题】使用从客户端收到的谷歌授权码在服务器端 javascript (nodejs) 上获取访问令牌【英文标题】:Get access token on server side javascript (nodejs) using google authorization code received from client side 【发布时间】:2017-10-11 07:52:26 【问题描述】:

我已经阅读了这个文档:- https://developers.google.com/identity/sign-in/web/server-side-flow

在最后一步,它接收授权码,然后显示使用 java 或 python 库接收访问令牌和刷新令牌的示例,但我在 nodejs 中找不到任何类似的示例。 如何使用 nodejs 复制相同的示例? 我不能只向某些 google oauth api 发送帖子或获取请求并使用授权码接收访问令牌吗?

提前致谢:)

【问题讨论】:

【参考方案1】:

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`);
);

【讨论】:

你能回复这个帖子吗? ***.com/questions/52727646/… 还是这个? ***.com/questions/54097179/… 我收到“无法读取未定义的属性 'OAuth2'”,我通过将 添加到 google 进行了修复。 var google = require('googleapis'); 在谷歌文档中找到的每个示例。 github.com/googleapis/google-api-nodejs-client 我收到 400 响应,带有“invalid_grant”

以上是关于使用从客户端收到的谷歌授权码在服务器端 javascript (nodejs) 上获取访问令牌的主要内容,如果未能解决你的问题,请参考以下文章

获取我的谷歌服务帐户的授权令牌密钥

未经授权的谷歌访问令牌

介绍一款chrom浏览器插件 DHC是一款使用chrome模拟REST客户端向服务器发送测试数据的谷歌浏览器插件

透明的谷歌齿轮场景验证

访问谷歌文档的用户的谷歌账户授权

没有浏览器的谷歌驱动器登录api