当令牌作为变量传递但在硬编码时传递时,身份验证失败

时间:2018-02-11 19:02:00

标签: node.js authentication github

我有一个node.js应用程序,用于检查GitHub中的拉取请求。

我的一个脚本叫做genToken.js,它会生成一个安装访问令牌。另一个是prCheck.js,它使用genToken.js并将返回值赋值给变量,然后在函数retrievePR中使用该变量。这是功能:

var installationAccessToken = getToken.getInstallationAccessToken(function(res) {});

retrievePR: function(owner, repoName, state, callback) {
var github = new GitHubApi({
  // optional
  timeout: 5000,
  host: 'api.github.com', // should be api.github.com for GitHub
  protocol: 'https',
  headers: {
    "Accept" : "application/vnd.github.machine-man-preview+json",
    "Authorization" : `Bearer ` + installationAccessToken
  }
});

github.pullRequests.getAll({
  owner: owner,
  repo: repoName,
  state: state
}, function(error, data){
  callback(error, data);
});

}

这会返回以下错误:

ERROR: Unable to retrive pull requests from github: {"message":"Bad credentials","documentation_url":"https://developer.github.com/v3"}

如果我换线:

"Authorization" : `Bearer ` + installationAccessToken

有:

 "Authorization" : `Bearer 1234`

其中1234是手动生成的令牌,身份验证不会失败。

此外,如果我在console.log("installationAccessToken", installationAccessToken);之后添加var installationAccessToken = getToken.getInstallationAccessToken(function(res) {});,我会看到它输出installationAccessToken undefined,这似乎发生在从genToken.js返回令牌之前。我认为这是某种同步问题。我不知道应该怎么处理它。

我做错了什么?

1 个答案:

答案 0 :(得分:1)

您可以这样做:

retrievePR: function (owner, repoName, state, callback) {
    getToken.getInstallationAccessToken((res) => {
        var installationAccessToken = res //here check and assign token from res
        var github = new GitHubApi({
            // optional
            timeout: 5000,
            host: 'api.github.com', // should be api.github.com for GitHub
            protocol: 'https',
            headers: {
                "Accept": "application/vnd.github.machine-man-preview+json",
                "Authorization": `Bearer ` + installationAccessToken
            }
        });

        github.pullRequests.getAll({
            owner: owner,
            repo: repoName,
            state: state
        }, function (error, data) {
            callback(error, data);
        });
    });
}