विशिष्ट डोमेन नाम के लिए Google OAuth2.0 के साथ लॉगिन ईमेल को प्रतिबंधित करें


90

मुझे अपने वेब एप्लिकेशन (जो OAuth2.0 और Google API का उपयोग करता है) में लॉगिन को प्रतिबंधित करने के बारे में कोई भी दस्तावेज नहीं मिल सकता है, केवल एक विशिष्ट डोमेन नाम या डोमेन नाम के सेट पर एक ईमेल वाले उपयोगकर्ताओं से प्रमाणीकरण अनुरोध स्वीकार करने के लिए। मैं ब्लैकलिस्ट करना चाहूंगा कि ब्लैकलिस्ट का विरोध करूं।

क्या किसी के पास यह करने के लिए सुझाव हैं, ऐसा करने की आधिकारिक तौर पर स्वीकृत विधि पर प्रलेखन, या चारों ओर एक आसान, सुरक्षित काम?

रिकॉर्ड के लिए, मुझे उपयोगकर्ता के बारे में तब तक कोई जानकारी नहीं है जब तक वे Google के OAuth प्रमाणीकरण के माध्यम से लॉग इन करने का प्रयास नहीं करते हैं। मेरे द्वारा प्राप्त सभी मूल उपयोगकर्ता जानकारी और ईमेल है।


3
मैं इस पर भी शोध कर रहा हूं। मेरे पास एक ऐप है जो मैं केवल उन लोगों द्वारा सुलभ होना चाहता हूं, जिनके पास हमारे डोमेन पर व्यावसायिक डोमेन के लिए खाता है। Google OpenID कार्यान्वयन हम दोनों के लिए अधिक उपयुक्त हो सकता है ...
हारून ब्रूस

1
मैं Google sdk और c # का उपयोग करके डोमेन उपयोगकर्ता लॉगिन कैसे लागू कर सकता हूं?
user1021583

1
कृपया कुछ इस सवाल पर एक नज़र डाल सकते हैं stackoverflow.com/questions/34220051/…

1
कृपया मुझे उस सवाल पर एक मोटी इनाम है, तो क्या कोई मेरी मदद कर सकता है

जवाबों:


42

तो मुझे आपके लिए जवाब मिल गया है। ऑउथ अनुरोध में आप "hd = domain.com" जोड़ सकते हैं और यह उस डोमेन के उपयोगकर्ताओं के लिए प्रमाणीकरण को प्रतिबंधित कर देगा (मुझे नहीं पता कि आप कई डोमेन कर सकते हैं)। आप यहाँ प्रलेखित एचडी पैरामीटर पा सकते हैं

मैं यहां से Google एपीआई पुस्तकालयों का उपयोग कर रहा हूं: 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/


मुझे इस पैरामीटर के बारे में पता नहीं था, क्या आप इसके बारे में पता लगा सकते हैं?
जेसन हॉल

दुर्भाग्य से मुझे जानकारी मेरे एक सहयोगी से लेनी पड़ी, मुझे यह Google के डॉक्स में कहीं भी नहीं मिला। मेरे सहकर्मी को लगता है कि उन्हें ओपेनआईडी कल्पना में संदर्भ मिला और उन्होंने ओपनआउथ कल्पना में यहां की कोशिश की और यह काम करने लगता है। मुझे लगता है सावधानी के साथ प्रयोग करें क्योंकि यह अनैच्छिक कार्यक्षमता प्रतीत होता है।
एरोन ब्रूस

31
महत्वपूर्ण नोट: भले ही आप फ़ंक्शन hdमें किसी पैरामीटर को निर्दिष्ट कर रहे हों createAuthUrl, फिर भी आपको यह सत्यापित करना होगा कि उपयोगकर्ता आपके ईमेल पते के साथ लॉग इन कर रहा है। सभी ईमेल पतों की अनुमति देने और बाद में अपने आवेदन तक पहुंचने की अनुमति देने के लिए लिंक पैरामीटर को बदलना बहुत आसान है।
23

1
hdपैरामीटर उपयोग पर Google दस्तावेज़ीकरण के लिए, Developers.google.com/identity/work/it-apps देखें और hdURI पैरामीटर का संदर्भ डेवलपर्स पाया जा सकता है ।google.com/identity/protocols/… सारांश में, hdपरम होना चाहिए Google प्रामाणिक पक्ष के लिए डोमेन आधारित प्रदर्शन फ़िल्टर के रूप में देखा जाता है, लेकिन फिर भी इसे आपके पक्ष में मान्य किया जाना चाहिए।
fyrye

2
महान, वर्तमान में, hdपैरामीटर में, मैं केवल एक डोमेन को प्रतिबंधित कर सकता हूं, अब क्या होगा अगर मैं दो या तीन डोमेन को प्रतिबंधित करना चाहता हूं?
जय पटेल

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

अपने प्रदाता को परिभाषित करते समय, 'एचडी' पैरामीटर के साथ अंत में हैश में गुजरें। आप यहाँ उस पर पढ़ सकते हैं। https://developers.google.com/accounts/docs/OpenIDConnect#hd-param

जैसे, config / initializers / devise.rb के लिए

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

1
यह आसानी से अन्य डोमेन के साथ प्रवेश करने के लिए पहुँच देने को दरकिनार किया जा सकता है। यह केवल उपयोगकर्ता को दिखाए गए उपलब्ध खातों को सीमित करने के लिए काम करेगा।
होमटैक्सो

2

यहाँ मैंने क्या किया है नोड में पासपोर्ट का उपयोग करते हुए। 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. '' '' प्रतीक एक ईमेल पते के पहले या दूसरे भाग में एक वैध चरित्र नहीं है। मैं एक ईमेल पता बनाकर फ़ंक्शन को ट्रिक नहीं कर सकता था जैसे mike@fake@google.com2. एक पारंपरिक लॉगिन सिस्टम में मैं कर सकता था, लेकिन यह ईमेल पता Google में कभी मौजूद नहीं हो सकता। यदि यह वैध Google खाता नहीं है, तो आप लॉगिन नहीं कर सकते।


1

२०१५ से पुस्तकालय में एक समारोह हुआ है, जिसमें पुस्तकालय के स्रोत को संपादित करने की आवश्यकता के बिना इसे सेट किया जा सकता है, जैसे कि एरोन-ब्रूस द्वारा वर्कअराउंड में

Url जेनरेट करने से पहले बस setHostedDomainअपने Google क्लाइंट के खिलाफ कॉल करें

$client->setHostedDomain("HOSTED DOMAIN")
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.