web-dev-qa-db-ja.com

GitHubアカウントをAWSCognito Identityプロバイダーとしてどのように使用できますか?

Cognito Identity Provider document を読むと、IDプロバイダーとしてFacebook/Google/Twitterとすぐに統合できるように見えることがわかります。

私のアプリケーションは開発者向けのアプリケーションなので、ユーザーが上記のIDプロバイダーのアカウントに加えてGithubアカウントでサインアップ/サインインできるようにしたいと思います。それは可能ですか?

可能であれば、(すぐに使用できるFacebook/Googleソーシャルサインアップ機能と比較して)どのくらいの追加作業を行う必要がありますか?

19
chen

この回答を最初に書いたときから、 CognitoがGitHubと通信するためのラッパーを提供するプロジェクト を実装して公開しました。 SAM/cloudformationデプロイスクリプトが付属しているため、ラッパーを非常に簡単に提供するCloudFormationスタックを作成できます。


そのため、OpenIDConnectはOAuth2.0の上に構築されています。これは拡張機能です-OpenIDConnectでは、OAuthエンドポイント(1つまたは2つの拡張機能または変更あり)といくつかの新しいエンドポイントがあります。

Cognitoのドキュメントと OpenID Connect および OAuth2. 仕様の関連ビットを読んだ私の理解は、Cognito OpenIDエンドポイントのうち4つのみを使用 = - 認証トークンserinfo およびjwks。 CognitoでOpenIDConnectプロバイダーを構成するときに、各エンドポイントを個別に指定できます。これは、これらのエンドポイントを実装することで、githubにOpenIDConnectを提供できることを意味します。

実装の大まかな計画は次のとおりです。

  • Authorization:仕様では、これはOAuth2.0エンドポイントと同じように見えます(さらに、関連するとは思わないいくつかの追加パラメーターgithubをIDプロバイダーとして使用)。私はあなたができると思います:

    • Github認証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にはまったく存在しませんが、コンテンツの多くは/usergithubへのリクエストで埋めることができると思いますエンドポイント(この時点で、リクエストには認証済みのaccess_tokenが含まれているため)。ちなみに、これがOAuth2.0をOpenID接続でラップするオープンソースシムがない理由です-OpenID接続の主な貢献はユーザーデータを通信する標準化された方法です-そしてOAuthこれを行うための標準化された方法では、GitHub(またはフェデレーションに使用したい他のOAuthのみのプロバイダー)に固有のカスタムを作成する必要があります。

  • [〜#〜] jwks [〜#〜]:これは、以下に使用できる公開鍵を含むJSONWeb鍵セットドキュメントです。トークンエンドポイントによって生成されたトークンを確認します。フラットファイルの可能性があります。

私は上記を実装しました、そしてアプローチはうまくいきます。 私はここでプロジェクトをオープンソース化しました

12
Timothy Jones

残念ながらそれは不可能です。 Cognito FederatedIdentitiesは任意のOIDCIdentity Providerをサポートできますが、OAuth2.0仕様ではその柔軟性が提供されないため、Githubの特別なサポートを追加しない限り、これを実現する簡単な方法はありません。

2
patanjal