Sepertinya saya tidak dapat menemukan dokumentasi apa pun tentang cara membatasi login ke aplikasi web saya (yang menggunakan OAuth2.0 dan Google API) untuk hanya menerima permintaan autentikasi dari pengguna dengan email pada nama domain tertentu atau kumpulan nama domain. Saya ingin memasukkan ke daftar putih, bukan daftar hitam.
Adakah yang punya saran tentang cara melakukan ini, dokumentasi tentang metode yang diterima secara resmi untuk melakukannya, atau solusi yang mudah dan aman?
Sebagai catatan, saya tidak mengetahui info apa pun tentang pengguna hingga mereka mencoba masuk melalui autentikasi OAuth Google. Yang saya terima kembali adalah info pengguna dasar dan email.
google-api
oauth-2.0
google-oauth
paradox870
sumber
sumber
Jawaban:
Jadi saya punya jawaban untuk Anda. Dalam permintaan oauth Anda dapat menambahkan "hd = domain.com" dan itu akan membatasi otentikasi ke pengguna dari domain itu (saya tidak tahu apakah Anda dapat melakukan beberapa domain). Anda dapat menemukan parameter hd yang didokumentasikan di sini
Saya menggunakan perpustakaan google api dari sini: http://code.google.com/p/google-api-php-client/wiki/OAuth2 jadi saya harus mengedit file /auth/apiOAuth2.php secara manual ke ini :
Sunting: Saya masih mengerjakan aplikasi ini dan menemukan ini, yang mungkin merupakan jawaban yang lebih tepat untuk pertanyaan ini. https://developers.google.com/google-apps/profiles/
sumber
hd
parameter dalamcreateAuthUrl
fungsi, Anda masih perlu memverifikasi bahwa pengguna masuk dengan alamat email domain Anda. Sangat mudah untuk mengubah parameter tautan untuk mengizinkan semua alamat email dan kemudian mendapatkan akses ke aplikasi Anda.hd
penggunaan parameter, lihat developers.google.com/identity/work/it-apps Dan referensihd
parameter URI dapat ditemukan developers.google.com/identity/protocols/… Dalam sinopsis,hd
param harus dilihat sebagai filter tampilan berbasis domain untuk Google Auth, tetapi masih harus divalidasi di sisi Anda.hd
parameter, saya hanya dapat membatasi satu domain, Sekarang bagaimana jika saya ingin membatasi dua atau tiga domain?Sisi klien:
Dengan menggunakan
auth2
fungsi init, Anda dapat memberikanhosted_domain
parameter untuk membatasi akun yang terdaftar di munculan masuk ke akun yang cocok dengan Andahosted_domain
. Anda dapat melihat ini dalam dokumentasi di sini: https://developers.google.com/identity/sign-in/web/referenceSisi server:
Meskipun dengan daftar sisi klien yang dibatasi, Anda perlu memverifikasi bahwa
id_token
domain tersebut cocok dengan domain yang Anda tentukan. Untuk beberapa implementasi, ini berarti memeriksahd
atribut yang Anda terima dari google setelah memverifikasi token.Contoh Full Stack:
Kode Web:
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(); }); }); } }); });
Kode Server (menggunakan pustaka Node.js googles):
Jika Anda tidak menggunakan Node.js, Anda dapat melihat contoh lain di sini: 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(); }); }); };
sumber
Saat menentukan penyedia Anda, berikan hash di bagian akhir dengan parameter 'hd'. Anda dapat membacanya di sini. https://developers.google.com/accounts/docs/OpenIDConnect#hd-param
Misalnya, untuk config / penginisialisasi / devise.rb
sumber
Inilah yang saya lakukan dengan menggunakan paspor di node.js.
profile
adalah pengguna mencoba untuk masuk.Kemudian buat logika untuk mencari beberapa domain, bukan hanya satu. Saya yakin metode ini aman karena 1. simbol '@' bukan karakter yang valid di bagian pertama atau kedua dari alamat email. Saya tidak dapat mengelabui fungsi tersebut dengan membuat alamat email seperti
mike@[email protected]
2. Dalam sistem login tradisional saya bisa, tetapi alamat email ini tidak pernah ada di Google. Jika ini bukan akun Google yang valid, Anda tidak dapat masuk.sumber
Sejak 2015 telah ada fungsi di perpustakaan untuk mengatur ini tanpa perlu mengedit sumber perpustakaan seperti di solusi oleh aaron-bruce
Sebelum membuat url, panggil saja
setHostedDomain
Klien Google Andasumber