গুগল OAuth2.0 এর সাথে লগইন ইমেলটিকে নির্দিষ্ট ডোমেন নামকে সীমাবদ্ধ করুন


90

আমার ওয়েব অ্যাপ্লিকেশনটিতে (যেমন OAuth2.0 এবং গুগল API গুলি ব্যবহার করে) লগইনকে সীমাবদ্ধ রাখার জন্য কোনও নির্দিষ্ট ডোমেন নাম বা ডোমেন নামের সেটটিতে কেবল ইমেলযুক্ত ব্যবহারকারীদের কাছ থেকে প্রমাণীকরণের অনুরোধগুলি গ্রহণ করার জন্য আমি কোনও দলিল খুঁজে পাচ্ছি না। আমি ব্ল্যাকলিস্টের বিরোধী হিসাবে শ্বেতলিস্ট করতে চাই।

কীভাবে এটি করা যায়, আনুষ্ঠানিকভাবে গৃহীত পদ্ধতিটির নথিভুক্তি, বা আশেপাশে কোনও সহজ, সুরক্ষিত কাজ সম্পর্কে কী পরামর্শ রয়েছে?

রেকর্ডের জন্য, আমি ব্যবহারকারী সম্পর্কে কোনও তথ্য জানি না যতক্ষণ না তারা Google এর OAuth প্রমাণীকরণের মাধ্যমে লগ ইন করার চেষ্টা করে। আমি ফিরে পেয়েছি সমস্ত হ'ল প্রাথমিক ব্যবহারকারীর তথ্য এবং ইমেল।


4
আমি এটিও গবেষণা করছি। আমার কাছে এমন একটি অ্যাপ্লিকেশন রয়েছে যা আমি কেবলমাত্র সেই ব্যবসায়ীরাই অ্যাক্সেসযোগ্য হতে চাই যাদের ব্যবসায়িক ডোমেনের জন্য আমাদের গুগল অ্যাপসে অ্যাকাউন্ট রয়েছে। গুগল ওপেনআইডি বাস্তবায়ন আমাদের দু'জনের জন্যই বেশি উপযুক্ত হতে পারে ...
অ্যারন ব্রুস

4
গুগল এসডিকে এবং সি # ব্যবহার করে আমি কীভাবে ডোমেন ব্যবহারকারী লগইন প্রয়োগ করতে পারি?
ব্যবহারকারী 1021583

4
দয়া করে করতে পারেন এই প্রশ্নের কিছু এক বর্ণন stackoverflow.com/questions/34220051/...

4
দয়া করে আমার এই প্রশ্নটিতে একটি অবজ্ঞাপূর্ণ অনুগ্রহ রয়েছে যাতে কেউ আমাকে সহায়তা করতে পারে

উত্তর:


42

সুতরাং আমি আপনার জন্য একটি উত্তর পেয়েছি। ওউথ অনুরোধে আপনি "এইচডি = ডোমেইন.কম" যুক্ত করতে পারেন এবং এটি সেই ডোমেনের ব্যবহারকারীদের কাছে প্রমাণীকরণকে সীমাবদ্ধ করবে (আপনি একাধিক ডোমেন করতে পারেন কিনা তা আমি জানি না)। আপনি এখানে এইচডি প্যারামিটার নথিভুক্ত পেতে পারেন

আমি এখান থেকে গুগল এপিআই লাইব্রেরি ব্যবহার করছি: 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/


আমি এই প্যারামিটার সম্পর্কে অবগত ছিলাম না, আপনি যেখানে এটি সম্পর্কে জানতে পেরেছেন সেখানে লিঙ্ক করতে পারবেন?
জেসন হল

দুর্ভাগ্যক্রমে আমার আমার সহকর্মীর কাছ থেকে তথ্য পেতে হয়েছিল, গুগলের ডক্সে আমি কোথাও এটি পাইনি। আমার সহকর্মী মনে করেন যে তিনি ওপেনআইডিপি অনুচ্ছেদে রেফারেন্সটি খুঁজে পেয়েছেন এবং এটি এখানে ওপেন এথ স্পেকে চেষ্টা করে দেখে মনে হচ্ছে এটি কার্যকর হয়েছে। আমি মনে করি সতর্কতার সাথে ব্যবহার করুন যেহেতু এটি অনির্ধারিত কার্যকারিতা বলে মনে হচ্ছে।
অ্যারন ব্রুস

31
গুরুত্বপূর্ণ দ্রষ্টব্য: আপনি যদি ফাংশনে কোনও hdপরামিতি নির্দিষ্ট createAuthUrlকরে থাকেন, তবুও আপনাকে যাচাই করতে হবে যে ব্যবহারকারী আপনার ডোমেন ইমেল ঠিকানা দিয়ে লগ ইন করছে। সমস্ত ইমেল ঠিকানাগুলিকে অনুমতি দেওয়ার জন্য এবং পরে আপনার অ্যাপ্লিকেশনটিতে অ্যাক্সেস পাওয়ার জন্য লিংক প্যারামিটারটি পরিবর্তন করা খুব সহজ।
ভিক্টরকিলো

4
এ Google নথিপত্রের জন্য hdপ্যারামিটার ব্যবহার দেখুন developers.google.com/identity/work/it-apps আর রেফারেন্স hdকোনো URI পরামিতি খুঁজে পাওয়া যেতে পারে developers.google.com/identity/protocols/... সারসংক্ষেপ সালে hdPARAM হওয়া উচিত গুগল অথের পক্ষে ডোমেন ভিত্তিক ডিসপ্লে ফিল্টার হিসাবে দেখা হয়েছে তবে এখনও আপনার পক্ষে বৈধ হওয়া উচিত।
বি।

4
দুর্দান্ত, বর্তমানে, hdপ্যারামিটারে, আমি কেবল একটি ডোমেনকে সীমাবদ্ধ রাখতে পারি, এখন যদি আমি দুটি বা তিনটি ডোমেন সীমাবদ্ধ রাখতে চাই?
জয় প্যাটেল

11

মক্কেলের পক্ষে:

auth2Init ফাংশনটি ব্যবহার করে , আপনি hosted_domainসাইন ইন পপআপে তালিকাবদ্ধ অ্যাকাউন্টগুলিকে আপনার সাথে মেলে এমনগুলি সীমাবদ্ধ করতে আপনি প্যারামিটারটি পাস করতে পারেন hosted_domain। আপনি এখানে ডকুমেন্টেশনে এটি দেখতে পারেন: https://developers.google.com/identity/sign-in/web/references

সার্ভার সাইড:

এমনকি একটি সীমাবদ্ধ ক্লায়েন্ট-সাইডের তালিকা সহ আপনাকে যাচাই করতে হবে যা id_tokenআপনি নির্দিষ্ট করেছেন এমন হোস্ট করা ডোমেনের সাথে মেলে। কিছু বাস্তবায়নের জন্য এর অর্থ hdটোকেন যাচাই করার পরে গুগল থেকে প্রাপ্ত বৈশিষ্ট্যটি পরীক্ষা করা ।

সম্পূর্ণ স্ট্যাক উদাহরণ:

ওয়েব কোড:

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

সার্ভার কোড (গুগল নোড.জেএস লাইব্রেরি ব্যবহার করে):

আপনি যদি নোড.জেএস ব্যবহার না করে থাকেন তবে আপনি এখানে অন্যান্য উদাহরণগুলি দেখতে পারেন: https://developers.google.com

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

উদাহরণস্বরূপ, কনফিগারেশন / আরম্ভকারী / devise.rb এর জন্য

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

4
এটি সহজেই অন্য ডোমেনগুলির সাথে লগইন করতে অ্যাক্সেস দেওয়ার বিষয়টি নিষ্ক্রিয় করা যায়। এটি কেবল ব্যবহারকারীর দেখানো উপলব্ধ অ্যাকাউন্ট সীমাবদ্ধ করার জন্য কাজ করবে।
হোমস্টো

2

নোড.জেজে পাসপোর্ট ব্যবহার করে যা করেছি তা এখানে's 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);

তারপরে কেবল একটির পরিবর্তে একাধিক ডোমেন সন্ধান করার জন্য যুক্তি তৈরি করুন। আমি বিশ্বাস করি যে এই পদ্ধতিটি নিরাপদ কারণ ১. '@' প্রতীকটি কোনও ইমেল ঠিকানার প্রথম বা দ্বিতীয় অংশে একটি বৈধ অক্ষর নয়। আমি mike@fake@google.com2 এর মতো ইমেল ঠিকানা তৈরি করে ফাংশনটি চালিত করতে পারি না aতিহ্যগত লগইন সিস্টেমে আমি পারতাম, তবে এই ইমেল ঠিকানাটি গুগলে কখনও থাকতে পারে না। যদি এটি কোনও বৈধ গুগল অ্যাকাউন্ট না হয় তবে আপনি লগইন করতে পারবেন না।


1

2015 যেহেতু একটি হয়েছে লাইব্রেরিতে ফাংশন হিসেবে সম্পাদনায় যান গ্রন্থাগার উৎস ছাড়াই এই সেট করতে কার্যসংক্রান্ত হারুন-ব্রুস দ্বারা

ইউআরএল তৈরি করার আগে কেবল setHostedDomainআপনার গুগল ক্লায়েন্টের বিরুদ্ধে কল করুন

$client->setHostedDomain("HOSTED DOMAIN")
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.