Google OAuth2.0のログインメールを特定のドメイン名に制限する


90

Webアプリケーション(OAuth2.0およびGoogle APIを使用)へのログインを制限して、特定のドメイン名または一連のドメイン名のメールを持つユーザーからの認証リクエストのみを受け入れる方法に関するドキュメントが見つからないようです。ブラックリストではなくホワイトリストに登録したい。

これを行う方法、公式に受け入れられている方法に関するドキュメント、または簡単で安全な回避策に関する提案はありますか?

記録のために、私はユーザーがGoogleのOAuth認証を介してログインを試みるまで、ユーザーに関する情報を知りません。私が受け取るのは、基本的なユーザー情報とメールだけです。


3
これも調べています。ビジネス向けGoogleアプリのドメインにアカウントを持っている人だけがアクセスできるようにしたいアプリがあります。Google OpenIDの実装は、私たち2人にとってより適切かもしれません...
アーロンブルース

1
Google SDKとC#を使用してドメインユーザーログインを実装するにはどうすればよいですか?
user1021583

1
この質問にいくつかのいずれかを見ることができますしてくださいstackoverflow.com/questions/34220051/...

1
私はその質問に懸賞金を持っているので、誰かが私を助けることができます

回答:


42

だから私はあなたのための答えを持っています。oauthリクエストで「hd = domain.com」を追加すると、そのドメインのユーザーに認証が制限されます(複数のドメインを実行できるかどうかはわかりません)。ここに記載されている hdパラメータを見つけることができます

私はここからgoogle apiライブラリを使用しています:http : //code.google.com/p/google-api-php-client/wiki/OAuth2したがって、/ auth / apiOAuth2.phpファイルを手動で編集する必要がありました:

public function createAuthUrl($scope) {
    $params = array(
        'response_type=code',
        'redirect_uri=' . urlencode($this->redirectUri),
        'client_id=' . urlencode($this->clientId),
        'scope=' . urlencode($scope),
        'access_type=' . urlencode($this->accessType),
        'approval_prompt=' . urlencode($this->approvalPrompt),
        'hd=domain.com'
    );

    if (isset($this->state)) {
        $params[] = 'state=' . urlencode($this->state);
    }
    $params = implode('&', $params);
    return self::OAUTH2_AUTH_URL . "?$params";
}

編集:私はまだこのアプリに取り組んでおり、これを発見しました。これがこの質問に対するより正しい答えかもしれません。https://developers.google.com/google-apps/profiles/


私はこのパラメータを知らなかったので、あなたがそれについて知った場所にリンクできますか?
Jason Hall

残念ながら、私の同僚から情報を入手する必要がありました。Googleのドキュメントのどこにもこの情報はありませんでした。私の同僚は、OpenID仕様で参照を見つけて、ここでOpenAuth仕様で試してみたと考えていますが、動作するようです。文書化されていない機能のようですので、注意して使用してください。
アーロンブルース

31
重要な注意:関数でhdパラメーターを指定しているcreateAuthUrl場合でも、ユーザーがドメインのメールアドレスでログインしていることを確認する必要があります。すべての電子メールアドレスを許可するようにリンクパラメーターを変更し、その後アプリケーションにアクセスするのは非常に簡単です。
VictorKilo 2013

1
でGoogleドキュメントのhd参照パラメータの使用developers.google.com/identity/work/it-appsの参照hdURIパラメータを見つけることができるdevelopers.google.com/identity/protocols/...を概要では、hdparamがあるべきGoogle Auth側のドメインベースの表示フィルターとして表示されますが、ユーザー側で検証する必要があります。
fyrye

2
すばらしい、現在、hdパラメーターでは、1つのドメインのみを制限できますが、2つまたは3つのドメインを制限したい場合はどうなりますか?
ジェイ・パテル

11

クライアント側:

auth2init関数を使用しhosted_domainて、サインインポップアップに表示されるアカウントをに一致するアカウントに制限するパラメーターを渡すことができますhosted_domain。こちらのドキュメントで確認できます:https : //developers.google.com/identity/sign-in/web/reference

サーバ側:

クライアント側のリストが制限されている場合でも、id_tokenが指定したホストドメインと一致することを確認する必要があります。一部の実装では、これはhd、トークンを確認した後にGoogleから受け取った属性を確認することを意味します。

フルスタックの例:

ウェブコード:

gapi.load('auth2', function () {
    // init auth2 with your hosted_domain
    // only matching accounts will show up in the list or be accepted
    var auth2 = gapi.auth2.init({
        client_id: "your-client-id.apps.googleusercontent.com",
        hosted_domain: 'your-special-domain.com'
    });

    // setup your signin button
    auth2.attachClickHandler(yourButtonElement, {});

    // when the current user changes
    auth2.currentUser.listen(function (user) {
        // if the user is signed in
        if (user && user.isSignedIn()) {
            // validate the token on your server,
            // your server will need to double check that the
            // `hd` matches your specified `hosted_domain`;
            validateTokenOnYourServer(user.getAuthResponse().id_token)
                .then(function () {
                    console.log('yay');
                })
                .catch(function (err) {
                    auth2.then(function() { auth2.signOut(); });
                });
        }
    });
});

サーバーコード(googles Node.jsライブラリを使用):

Node.jsを使用していない場合は、https//developers.google.com/identity/sign-in/web/backend-authで他の例を確認できます

const GoogleAuth = require('google-auth-library');
const Auth = new GoogleAuth();
const authData = JSON.parse(fs.readFileSync(your_auth_creds_json_file));
const oauth = new Auth.OAuth2(authData.web.client_id, authData.web.client_secret);

const acceptableISSs = new Set(
    ['accounts.google.com', 'https://accounts.google.com']
);

const validateToken = (token) => {
    return new Promise((resolve, reject) => {
        if (!token) {
            reject();
        }
        oauth.verifyIdToken(token, null, (err, ticket) => {
            if (err) {
                return reject(err);
            }
            const payload = ticket.getPayload();
            const tokenIsOK = payload &&
                  payload.aud === authData.web.client_id &&
                  new Date(payload.exp * 1000) > new Date() &&
                  acceptableISSs.has(payload.iss) &&
                  payload.hd === 'your-special-domain.com';
            return tokenIsOK ? resolve() : reject();
        });
    });
};

9

プロバイダーを定義するときは、最後に「hd」パラメーターを使用してハッシュを渡します。あなたはそれについてここで読むことができます。https://developers.google.com/accounts/docs/OpenIDConnect#hd-param

たとえば、config / initializers / devise.rbの場合

config.omniauth :google_oauth2, 'identifier', 'key', {hd: 'yourdomain.com'}

1
これは簡単に回避でき、他のドメインでのログインへのアクセスを許可します。ユーザーに表示される利用可能なアカウントを制限するためにのみ機能します。
homaxto

2

node.jsでパスポートを使用して実行した内容は次のとおりです。profileログインしようとしているユーザーです。

//passed, stringified email login
var emailString = String(profile.emails[0].value);
//the domain you want to whitelist
var yourDomain = '@google.com';
//check the x amount of characters including and after @ symbol of passed user login.
//This means '@google.com' must be the final set of characters in the attempted login 
var domain = emailString.substr(emailString.length - yourDomain.length);

//I send the user back to the login screen if domain does not match 
if (domain != yourDomain)
   return done(err);

次に、1つだけではなく複数のドメインを検索するロジックを作成します。「@」記号は、メールアドレスの最初または2番目の部分にある有効な文字ではないため、この方法は安全だと思います。mike@fake@google.com2のようなメールアドレスを作成して関数をだますことはできませんでした。従来のログインシステムではできましたが、このメールアドレスがGoogleに存在することはありませんでした。有効なGoogleアカウントでない場合は、ログインできません。


1

2015年以降、aaron-bruceによる回避策のようにライブラリのソースを編集する必要なしにこれを設定する関数がライブラリにありました

URLを生成する前にsetHostedDomain、Googleクライアントを呼び出します

$client->setHostedDomain("HOSTED DOMAIN")
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.