3

我在 Angular 单页应用程序 (SPA) 中使用 GitHub API 客户端“ octokit/rest.js ”。鉴于它通常更安全,并且我对我的 GitHub 帐户使用 2 因素身份验证(仅密码是不够的),我想使用 OAuth 工作流程。我一直按照此处的说明获取访问令牌,然后使用它来构建 octokit 客户端:

login(token: string) {
  this.client = new Octokit({
    auth: `token ${token}`
  });
}

为了获取令牌,我必须制作一个简单的后端,其目的只是获取令牌并将其传递给前端,因为我还没有弄清楚如何从 SPA 中安全地执行此操作(它需要一个我无法在前端保持安全的 client_secret?)。它似乎有效,但我仍然有重要的问题:

  • 这安全吗?还是应该只保留服务器端的访问令牌?
  • 有没有更好的方法只从前端处理 octokit/GitHub API 身份验证?
4

1 回答 1

6

ocotkit/rest.js维护者在这里

client_secret无法与客户端共享。OAuth 流程需要一个保持client_secret安全的后端。

另一种方法是使用您的用户名和密码创建令牌,在这种情况下,您不需要服务器组件。但通常用户可能不愿意与外部网站共享他们的登录凭据。但对于个人/内部项目,这可能是最简单的方法。

let octokit = new Octokit({
  auth: {
    username: USERNAME,
    password: PASSWORD,
    on2fa () {
      return prompt('Enter code')
    }
  }
})

octokit.oauthAuthorizations.createAuthorization({
  scopes: [], // add scopes
  note: 'token description'
})

  .then(({ data: { token } }) => {
    octokit = new Octokit({ auth: 'token ${token}' })
    // octokit is now authenticated with token
  })

请注意,令牌note必须是唯一的。如果您之前创建了具有相同注释的令牌,则需要先使用不同的注释或删除现有令牌。

我们目前正在考虑添加更多auth.*选项,以便在发送任何请求之前在内部为您创建一个令牌。如果您有兴趣,我们正在https://github.com/octokit/rest.js/pull/1293讨论此更改

于 2019-03-26T18:07:38.167 回答