我的应用程序是面向开发人员的应用程序,因此我希望能够让用户使用他们的 Github 帐户进行注册/登录,除了上述 Identity Provider 的帐户。这是否可行?
如果可以,与开箱即用的 Facebook/Google 社交登录功能相比,我需要做多少额外的工作?
自从我第一次写这篇答案以来,我实现并发布了一个项目,提供一个用于Cognito与GitHub通信的包装器。它带有一个SAM/cloudformation部署脚本,因此您可以非常容易地创建一个CloudFormation堆栈,提供该包装器。
因此,OpenID Connect建立在OAuth2.0之上,它是一个扩展 - 在OpenID Connect中,OAuth端点存在(有一个或两个扩展或更改),加上一些新的端点。
从阅读Cognito文档和与OpenID Connect和OAuth2.0相关的部分之后,我的理解是Cognito 仅使用四个OpenID端点 - Authorization、token、userinfo 和 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密钥集文档。它可以是一个平面文件。
很遗憾,这是不可能的。Cognito联合身份可以支持任何OIDC身份提供者,但OAuth2.0规范并没有给出这种灵活性,因此除非我们为Github添加特殊支持,否则没有简单的方法来实现这一点。