我们如何将GitHub账户用作AWS Cognito身份提供者?

26
通过阅读 Cognito Identity Provider 文档,我了解到它似乎提供了与 Facebook / Google / Twitter 作为身份提供者的开箱即用集成。
我的应用程序是面向开发人员的应用程序,因此我希望能够让用户使用他们的 Github 帐户进行注册/登录,除了上述 Identity Provider 的帐户。这是否可行?
如果可以,与开箱即用的 Facebook/Google 社交登录功能相比,我需要做多少额外的工作?
2个回答

26

自从我第一次写这篇答案以来,我实现并发布了一个项目,提供一个用于Cognito与GitHub通信的包装器。它带有一个SAM/cloudformation部署脚本,因此您可以非常容易地创建一个CloudFormation堆栈,提供该包装器。


因此,OpenID Connect建立在OAuth2.0之上,它是一个扩展 - 在OpenID Connect中,OAuth端点存在(有一个或两个扩展或更改),加上一些新的端点。

从阅读Cognito文档和与OpenID ConnectOAuth2.0相关的部分之后,我的理解是Cognito 仅使用四个OpenID端点 - Authorizationtokenuserinfo 和 jwks。在配置Cognito中的OpenID Connect提供程序时,可以单独指定每个端点。这意味着可以通过实现这些端点来为github提供OpenID Connect。

以下是实现的大致计划:

  • Authorization授权:在规范中,这似乎与OAuth2.0端点相同(加上一些我认为与将github用作标识提供者无关的附加参数)。您可以:

    • 使用github Auth URL:https://github.com/login/oauth/authorize

    • 将您的GitHub OAuth应用设置为重定向到https://<your_cognito_domain>/oauth2/idpresponse

对于其他端点,你需要自己编写:

  • Token:这用于获取访问和ID令牌 - 使用授权回调返回的code。它看起来与OAuth2.0端点相同,但也返回一个idToken。似乎可以实现将code传递到Github的令牌端点(https://github.com/login/oauth/access_token)以获取accessToken,然后生成一个使用您自己的私钥签名的idToken

  • UserInfo:OAuth2.0中完全不存在这个功能,但我认为大部分内容可能可以通过请求/user Github端点(因为此时请求包含已验证的access_token)来填充。顺便说一下,这就是没有用OpenID连接包装OAuth2.0的开源shim的原因 - OpenID连接的主要贡献是一种标准化的用户数据通信方式 - 由于OAuth没有标准化的方法来完成这项任务,我们必须编写一个特定于GitHub(或任何其他我们想用于联合身份验证的仅OAuth提供程序)的自定义方法。

  • JWKS:这是包含可用于验证令牌的公钥的JSON Web密钥集文档。它可以是一个平面文件。

我已经实现了上述内容,并且这种方法有效。 我在这里开源了该项目

1
这仍然是与Github进行身份验证的唯一方式吗? - colemars
1
这似乎是另一种实现方式:https://github.com/gauravlanjekar/lambda-github-authorizer - Simon Forsberg
1
@SimonForsberg,该实现似乎是针对使用Lambda的API网关身份验证,而不是Cognito的OIDC。除非我漏掉了什么,否则您无法使用它来解决问题。 - Timothy Jones
1
一定要说,这是一个很棒的库。谢谢。 - Matteo

2

很遗憾,这是不可能的。Cognito联合身份可以支持任何OIDC身份提供者,但OAuth2.0规范并没有给出这种灵活性,因此除非我们为Github添加特殊支持,否则没有简单的方法来实现这一点。


在“除非我们添加…”中,we指的是谁? AWS Cognito团队还是开发人员我自己? - chen
2
@patanjal 根据他的个人资料是 AWS Cognito 的开发人员。有没有更复杂的方法来做这件事? - MynockSpit
2
这条消息已经一年了。有任何更新吗? 您认为将Github登录包装到自定义IDP中是否可能? - Thomas Arnaud
这里的另一个答案似乎表明这个服务器是错误的。 - Simon Forsberg
使用基于TypeScript的Lambda(无框架)进行备用实现,通过Function URL、AWS CDK配置和共享Github客户端密钥而非证书进行发布:https://github.com/shorn/zinc - Shorn

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接