我正在使用passportjs库对应用程序中的用户进行身份验证。当用户使用 passportjs 成功进行身份验证时,通常会生成访问令牌。我正在尝试使用此访问令牌使用 github API 创建一个分支,但没有取得多大成功,既使用 octokit 包装器,也使用超级代理发布。
我首先尝试以这种方式通过提供用户名和密码来验证octokit。
let octokit=new Octokit({
auth:{
username:username,
password:password
}
});
然后我能够毫无问题地创建一个引用/分支。但是,当我做同样的事情但使用 github SSO 生成的访问令牌时,就像这样
passport.use(new GitHubStrategy({
clientID: keys.clientId,
clientSecret: keys.clientSecret,
callbackURL: "/auth/github/callback"
},
async (accessToken, refreshToken, profile, done) => {
let octokit = new Octokit(auth: `token ${accessToken}`);
const branchName = 'refs/heads/vue' + Math.random();
let masterHash = '123x123x1231232';
octokit.git.createRef({
owner: owner,
repo: 'gitDemo',
ref: branchName,
sha: masterHash
}).then((data) => {
console.log('data ', data);
});
}
我收到"http错误:未找到"错误。我尝试的另一种方法是使用超级代理直接发布到端点,将访问代码放在授权标头中。
const data={
ref:'refs/heads/FooBranch',
sha:masterHash
};
const res2=await request.post('https://api.github.com/repos/SomeOwner/SomeRepo/git/refs')
.set('Authorization','token '+accessToken)
.send(data);
但是,我仍然收到一个 httpError :未找到的问题。我很困惑我可能做错了什么。谢谢,任何帮助将不胜感激!
我在这里找到了anwser。
基本上,您不使用JSON而是使用FormData发送数据。 所以帖子应该看起来像这样(从链接复制):
let data = new FormData()
data.append('client_id', options.client_id)
data.append('client_secret', options.client_secret)
data.append('code', code)
fetch(`https://github.com/login/oauth/access_token`, {
method: 'POST',
body: data
})
如果将来有其他人遇到这种情况,您必须在发出请求时指定Content-Type
和Accept
。如果不在标头中指定它,您将必须发送和接收FormData
。
@Github在他们的文档中根本没有提到这一点而感到高兴。
使用节点的内置fetch
:
const githubRes = await fetch(githubUrl, {
method: "POST",
headers: {
"Accept": "application/json",
"Content-Type": "application/json",
},
body: JSON.stringify({
code,
client_id: config.github.clientId,
client_secret: config.github.clientSecret,
redirect_uri: config.github.redirectUri,
}),
});
const githubJson = await githubRes.json();
const token = githubJson.access_token;