จำกัด อีเมลสำหรับเข้าสู่ระบบด้วย Google OAuth2.0 เฉพาะโดเมนเนม


90

ดูเหมือนว่าฉันไม่พบเอกสารเกี่ยวกับวิธี จำกัด การเข้าสู่ระบบสำหรับเว็บแอปพลิเคชันของฉัน (ซึ่งใช้ OAuth2.0 และ Google APIs) เพื่อยอมรับเฉพาะคำขอการตรวจสอบสิทธิ์จากผู้ใช้ที่มีอีเมลในชื่อโดเมนหรือชุดชื่อโดเมนที่เจาะจง ฉันต้องการอนุญาตพิเศษตรงข้ามกับบัญชีดำ

ใครมีคำแนะนำเกี่ยวกับวิธีการทำเอกสารเกี่ยวกับวิธีการที่ได้รับการยอมรับอย่างเป็นทางการหรือวิธีแก้ปัญหาที่ง่ายและปลอดภัย

สำหรับบันทึกนี้ฉันไม่ทราบข้อมูลใด ๆ เกี่ยวกับผู้ใช้จนกว่าพวกเขาจะพยายามเข้าสู่ระบบผ่านการตรวจสอบสิทธิ์ OAuth ของ Google สิ่งที่ฉันได้รับกลับมาคือข้อมูลผู้ใช้พื้นฐานและอีเมล


3
ฉันกำลังค้นคว้าเรื่องนี้ด้วย ฉันมีแอปที่ต้องการให้ผู้ที่มีบัญชีผู้ใช้ในโดเมน Google Apps สำหรับธุรกิจเข้าถึงได้เท่านั้น การติดตั้ง Google OpenID อาจเหมาะสมกว่าสำหรับเราทั้งคู่ ...
Aaron Bruce

1
ฉันจะใช้การเข้าสู่ระบบผู้ใช้โดเมนโดยใช้ google sdk และ c # ได้อย่างไร
user1021583

1
ช่วยดูคำถามนี้ได้

1
ได้โปรดฉันมีค่าหัวสำหรับคำถามนั้นเพื่อช่วยฉันได้

คำตอบ:


42

ฉันมีคำตอบให้คุณ ในคำขอ oauth คุณสามารถเพิ่ม "hd = domain.com" และจะ จำกัด การตรวจสอบสิทธิ์เฉพาะผู้ใช้จากโดเมนนั้น (ฉันไม่รู้ว่าคุณสามารถทำหลายโดเมนได้หรือไม่) คุณสามารถค้นหาพารามิเตอร์ hd ได้ที่นี่

ฉันใช้ google api libraries จากที่นี่: 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 และดูเหมือนว่าจะได้ผล ฉันคิดว่าใช้ด้วยความระมัดระวังเนื่องจากดูเหมือนว่าจะเป็นฟังก์ชันที่ไม่มีเอกสาร
Aaron Bruce

31
หมายเหตุสำคัญ: แม้ว่าคุณจะระบุhdพารามิเตอร์ในcreateAuthUrlฟังก์ชัน แต่คุณยังคงต้องตรวจสอบว่าผู้ใช้เข้าสู่ระบบด้วยที่อยู่อีเมลโดเมนของคุณ การเปลี่ยนพารามิเตอร์ลิงก์เป็นเรื่องง่ายมากเพื่อให้ที่อยู่อีเมลทั้งหมดและเข้าถึงแอปพลิเคชันของคุณได้ในภายหลัง
VictorKilo

1
สำหรับเอกสาร Google เกี่ยวกับการhdใช้งานพารามิเตอร์โปรดดูที่developers.google.com/identity/work/it-appsและการอ้างอิงของhdพารามิเตอร์ URI สามารถพบได้developer.google.com/identity/protocols/…ในบทสรุปhdพารามิเตอร์ควรเป็น มองว่าเป็นตัวกรองการแสดงผลตามโดเมนสำหรับฝั่ง Google Auth แต่ยังควรได้รับการตรวจสอบความถูกต้องจากฝั่งของคุณ
Will B.

2
เยี่ยมมากในขณะนี้ในhdพารามิเตอร์ฉันสามารถ จำกัด ได้เพียงโดเมนเดียวแล้วถ้าฉันต้องการ จำกัด สองหรือสามโดเมนล่ะ
Jay Patel

11

ด้านลูกค้า:

การใช้auth2ฟังก์ชั่น init คุณสามารถผ่าน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. สัญลักษณ์ "@" ไม่ใช่อักขระที่ถูกต้องในส่วนแรกหรือส่วนที่สองของที่อยู่อีเมล ฉันไม่สามารถหลอกล่อฟังก์ชันด้วยการสร้างที่อยู่อีเมลแบบ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.