1

我已经通过本文档了接收: - https://developers.google.com/identity/sign-in/web/server-side-flow获取接入令牌从客户端

在它接收到的授权码的最后一个步骤之后,它示出了示例使用Java或Python库接收访问令牌和刷新令牌,但我无法在nodejs中找到任何类似的示例。 如何使用nodejs复制同一个示例? 我不能只发送一个帖子或获得一些谷歌oauth api的请求,并使用授权码接收访问令牌吗?

感谢提前:)

回答

3

Google APIs Node.js Client库提供oauth2Client.getToken(code, cb)这给访问令牌(以及可选的刷新令牌)的授权码的交换:在https://github.com/google/google-api-nodejs-client/tree/master/samples,其中包括

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

官方例子是购oauth2.js,oauth部分的帮手

您还可以在Paul Shan的this site上找到完整的示例,它是一个点头例如使用Google APIs Node.js Client。编辑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}`); 
}); 
相关问题