当前位置: 首页 > 知识库问答 >
问题:

使用节点js的googleoauth2

臧亦
2023-03-14

我有一个Vuejs应用程序,我试图添加谷歌认证。我使用这个插件https://www.npmjs.com/package/vue-google-oauth2在前端生成授权代码,然后将其发送到我的后端,以便它可以获得用户凭据。

以下是前端的代码:

<script>
import axios from "axios";
export default {
  methods: {
    googleAuth() {
      this.$gAuth
        .getAuthCode()
        .then(authCode => {
          //on success
          axios.post('my-back-end', {code:authCode, redirect_uri: 'postmessage'}).then(res=>{
              console.log(res);
          });
        })
        .catch(error => {
          //on fail do something
        });
    }
  }
};
</script>

在此之前,我成功地获取了授权代码,并将其发送到使用node编写的后端。js基于官方谷歌文档。https://github.com/googleapis/google-api-nodejs-client#oauth2-客户

我有这条路线:

router.post('/google', googleController.getGoogleAccountFromCode);

该控制器:

const {google} = require('googleapis');

const oauth2Client = new google.auth.OAuth2(
    process.env.GOOGLE_CLIENT_ID,
    process.env.GOOGLE_CLIENT_SECRET,
    process.env.GOOGLE_REDIRECT_URL
);

exports.getGoogleAccountFromCode = (req, res, next) => {
   const code = req.body.code;
   const data = oauth2Client.getToken(code)
    .then(res => {
        console.log(res);
    })
    .catch(err=>{
        console.log(err);
    });
};

我得到这个错误:

{错误:进程中Gaxios.request(/home/monkeydkon/Desktop/tabata rest/node_modules/Gaxios/build/src/Gaxios.js:70:23)处的_请求无效。_tickCallback(internal/process/next_tick.js:68:7)响应:{config:{method:'POST',url:'https://oauth2.googleapis.com/token,数据:'code=4/lggdaumbzrceo1grav2csrbqkmoqfm7ikhbup3tjvf2nsp2nbqbdc9mdqiuam847zipy6mz4mghld9fr2a3a_Q

我真的无法理解谷歌文档。对oauth2没有适当的支持。我真的需要一些帮助。谢谢

共有1个答案

岳毅
2023-03-14

我以前也遇到过这个问题。你的前端代码看起来不错。您只是缺少后端上的一些内容。

尝试将控制器更改为此

const {google} = require('googleapis');

exports.getGoogleAccountFromCode = (req, res, next) => {
    const code = req.body.code;
    const oauth2Client = new google.auth.OAuth2(process.env.GOOGLE_CLIENT_ID, process.env.GOOGLE_CLIENT_SECRET, 'postmessage');
    google.options({ auth: oauth2Client });


    oauth2Client.getToken(code).then(res => {
        const tokens = res.tokens;
        oauth2Client.setCredentials(tokens);
        const oauth2 = google.oauth2({ version: 'v2' });
        return oauth2.userinfo.get();
    })
        .then(userData => {
            console.log(userData);
        })
        .catch(err => {
            console.log(err);
        });
};

实际上你错过的只是谷歌。选项。然后,提取令牌和用户信息。你应该可以用它们做你想做的事。

测试时也不要忘记(例如:POSTMAN)每次尝试总是发送一个新的code

 类似资料:
  • 我已经开始在一个简单的node.js应用程序中使用Q Promise包。所以我对如何在所有Promise序列完成后关闭数据库连接感兴趣。 例子: 我想在显示集合名称后关闭连接,但此匿名函数中没有db上下文。 有没有办法用promise模式处理此类案件?

  • 最近我用budo部署了一个node.js服务器端应用程序,它工作正常...但是在部署到Azure(WebAPP)后,它不起作用,并抛出“需要”未定义的错误。我使用VSCode开发项目

  • 这是我的模型。 这是我的控制器用户。js: app.post('/Signup/',函数(req, res){{console.log(req.body.username); User.new用户( 这个概念是一旦用户名/密码被接受,一个API密钥将与用户名一起存储。虽然,用户名负载正在被接受,但是当我执行UserApiSchema调用来生成api时,没有生成这样的api。也没有错误。

  • 问题内容: 我正在使用Angular JS和Node JS开发应用程序,我需要查看用户机器中所有可用的打印机,让用户选择其中一台并打印收据。 有没有办法做到这一点? 问题答案: 我做了一个这样的应用程序。我使用http://nwjs.io/和注释中的模块来完成它:https : //www.npmjs.com/package/printer,这是该模块打印的有效代码在默认打印机中原始文件: 您可以

  • 我有: 它记录了: 我不明白为什么会这样。

  • 请帮我解决以下问题。我创建了默认节点。使用Visual Studio nodejs工具和express的js应用程序,现在我尝试调用在node中声明的setTimeout函数。d、 ts.代码如下: 但是代码没有编译,表示无法将“Number”转换为“NodeTimer” 据我所知,问题是它需要标准的setTimeout函数,而不是从节点获取函数。d、 ts。 我尝试指定对节点的引用。d、 带<代