Google OAuth2.0 ile Giriş E-postasını Belirli Alan Adıyla Sınırlandırın


90

Web uygulamamla (OAuth2.0 ve Google API'larını kullanan) girişi yalnızca belirli bir alan adı veya alan adı kümesi üzerinde e-postası olan kullanıcılardan gelen kimlik doğrulama isteklerini kabul edecek şekilde nasıl kısıtlayacağıma ilişkin herhangi bir belge bulamıyorum. Kara listeye değil beyaz listeye eklemek istiyorum.

Bunun nasıl yapılacağına dair önerileri, bunu yapmanın resmi olarak kabul edilen yöntemine ilişkin belgeleri veya kolay, güvenli bir çözümü olan var mı?

Kayıt için, Google'ın OAuth kimlik doğrulaması aracılığıyla giriş yapmaya çalışana kadar kullanıcı hakkında herhangi bir bilgi bilmiyorum. Geri aldığım tek şey temel kullanıcı bilgileri ve e-posta.


3
Bunu da araştırıyorum. Yalnızca iş için Google uygulamalarımızda hesabı olan kişilerin erişmesini istediğim bir uygulamam var. Google OpenID uygulaması ikimiz için daha uygun olabilir ...
Aaron Bruce

1
Google sdk ve c # kullanarak etki alanı kullanıcı girişini nasıl uygulayabilirim?
user1021583

1
Lütfen birileri bu soruya göz

1
Lütfen bu soru için bir oben

Yanıtlar:


42

O halde sana bir cevabım var. Oauth isteğinde "hd = domain.com" ekleyebilir ve bu, kimlik doğrulamasını o alandaki kullanıcılarla sınırlar (Birden fazla alan adı yapıp yapamayacağınızı bilmiyorum). Burada belgelenen hd parametresini bulabilirsiniz

Google api kitaplıklarını buradan kullanıyorum: http://code.google.com/p/google-api-php-client/wiki/OAuth2, bu yüzden /auth/apiOAuth2.php dosyasını buna manuel olarak düzenlemek zorunda kaldım :

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";
}

Düzenleme: Hala bu uygulama üzerinde çalışıyorum ve bunu buldum, bu soruya daha doğru cevap olabilir. https://developers.google.com/google-apps/profiles/


Bu parametrenin farkında değildim, bunu öğrendiğiniz yere bağlantı verebilir misiniz?
Jason Hall

Maalesef bir meslektaşımdan bilgi almak zorunda kaldım, bunu google'ın belgelerinde hiçbir yerde bulamadım. İş arkadaşım referansı OpenID spesifikasyonunda bulduğunu ve burada OpenAuth spesifikasyonunda denediğini düşünüyor ve işe yarıyor gibi görünüyor. Belgelenmemiş bir işlevsellik gibi göründüğü için sanırım dikkatli kullanın.
Aaron Bruce

31
Önemli Not: İşlevde bir hdparametre belirleseniz bile createAuthUrl, kullanıcının etki alanı e-posta adresinizle giriş yaptığını doğrulamanız gerekecektir. Tüm e-posta adreslerine izin vermek ve ardından uygulamanıza erişim sağlamak için bağlantı parametresini değiştirmek çok kolaydır.
VictorKilo

1
hdParametre kullanımıyla ilgili Google Dokümantasyonu için developers.google.com/identity/work/it-apps adresine bakın . hdURI parametresinin referansı, developers.google.com/identity/protocols/… adresinde bulunabilir . Özet olarak,hd param Google Auth tarafı için alan tabanlı bir görüntüleme filtresi olarak görülüyor, ancak yine de sizin tarafınızdan doğrulanması gerekiyor.
Will B.

2
Harika, Şu anda, hdparametrede yalnızca bir alanı kısıtlayabilirim, Şimdi ya iki veya üç alanı kısıtlamak istersem?
Jay Patel

11

İstemci Tarafı:

auth2İnit işlevini kullanarak, hosted_domainoturum açma açılır penceresinde listelenen hesapları sizinle eşleşenlerle sınırlandırmak için parametreyi iletebilirsiniz hosted_domain. Bunu buradaki belgelerde görebilirsiniz: https://developers.google.com/identity/sign-in/web/reference

Sunucu Tarafı:

Kısıtlı bir istemci tarafı listesiyle bile, id_tokenbelirttiğiniz barındırılan alanla eşleştiğini doğrulamanız gerekecektir . Bazı uygulamalar için bu hd, jetonu doğruladıktan sonra google'dan aldığınız özniteliğin kontrol edilmesi anlamına gelir .

Tam Yığın Örneği:

Web Kodu:

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(); });
                });
        }
    });
});

Sunucu Kodu (googles Node.js kitaplığı kullanılarak):

Node.js kullanmıyorsanız burada diğer örnekleri görebilirsiniz: 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

Sağlayıcınızı tanımlarken, sonunda 'hd' parametresi ile bir karma girin. Bu konuyu buradan okuyabilirsiniz. https://developers.google.com/accounts/docs/OpenIDConnect#hd-param

Örneğin, config / initializers / devise.rb için

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

1
Bu, diğer alan adlarıyla giriş yapmak için erişim izni vererek kolayca aşılabilir. Yalnızca kullanıcıya gösterilen mevcut hesapları sınırlandırmak için çalışacaktır.
homaxto

2

Node.js'de passport kullanarak yaptığım şey şudur. profilekullanıcı oturum açmaya çalışıyor.

//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);

Ardından, tek bir alan yerine birden çok alan aramak için bir mantık oluşturun. Bu yöntemin güvenli olduğuna inanıyorum çünkü 1. '@' sembolü bir e-posta adresinin birinci veya ikinci kısmında geçerli bir karakter değil. mike@fake@google.com2 gibi bir e-posta adresi oluşturarak işlevi kandıramazdım. Geleneksel bir giriş sisteminde yapabilirdim, ancak bu e-posta adresi Google'da asla var olamazdı. Geçerli bir Google hesabı değilse giriş yapamazsınız.


1

2015'ten beri kütüphanede, aaron-bruce'un geçici çözümünde olduğu gibi, kütüphanenin kaynağını düzenlemeye gerek kalmadan bunu ayarlamak için bir işlev bulunmaktadır.

URL'yi oluşturmadan önce setHostedDomainGoogle İstemcinizi aramanız yeterli

$client->setHostedDomain("HOSTED DOMAIN")
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.