Ringkasan
Penautan Login dengan Google yang disederhanakan OAuth menambahkan Login dengan Google di atas penautan OAuth. Hal ini memberikan pengalaman penautan yang lancar bagi pengguna Google, dan juga memungkinkan pembuatan akun, yang memungkinkan pengguna membuat akun baru di layanan Anda menggunakan Akun Google mereka.
Untuk melakukan penautan akun dengan OAuth dan Login dengan Google, ikuti langkah-langkah umum berikut:
- Pertama, minta pengguna untuk memberi izin untuk mengakses profil Google mereka.
- Gunakan informasi di profil mereka untuk memeriksa apakah akun pengguna ada.
- Untuk pengguna lama, tautkan akun.
- Jika Anda tidak dapat menemukan kecocokan untuk pengguna Google di sistem autentikasi, validasi token ID yang diterima dari Google. Kemudian, Anda dapat membuat pengguna berdasarkan informasi profil yang terdapat dalam token ID.
![Gambar ini menunjukkan langkah-langkah bagi pengguna untuk menautkan Akun Google mereka menggunakan alur penautan yang disederhanakan. Screenshot pertama menunjukkan cara pengguna dapat memilih aplikasi Anda untuk ditautkan. Screenshot kedua memungkinkan pengguna mengonfirmasi apakah mereka sudah memiliki akun di layanan Anda atau tidak. Screenshot ketiga memungkinkan pengguna memilih Akun Google yang ingin ditautkan. Screenshot keempat menampilkan konfirmasi untuk menautkan Akun Google mereka dengan aplikasi Anda. Screenshot kelima menampilkan akun pengguna yang berhasil ditautkan di aplikasi Google.](https://developers.google.cn/static/identity/account-linking/images/streamlined-linking-flow.png?authuser=9&hl=id)
Gambar 1. Penautan Akun di ponsel pengguna dengan Penautan yang Disederhanakan
Persyaratan untuk Penautan yang Disederhanakan
- Terapkan alur penautan OAuth web dasar. Layanan Anda harus mendukung endpoint otorisasi dan pertukaran token yang mematuhi OAuth 2.0.
- Endpoint pertukaran token Anda harus mendukung pernyataan JSON Web Token (JWT) dan menerapkan intent
check
,create
, danget
.
Mengimplementasikan server OAuth
Endpoint pertukaran token Anda harus mendukung intent check
, create
, get
. Di bawah ini menunjukkan langkah-langkah yang diselesaikan melalui alur penautan akun dan menunjukkan kapan intent yang berbeda dipanggil:
- Apakah pengguna memiliki akun di sistem autentikasi Anda? (Pengguna memutuskan dengan memilih YA atau TIDAK)
- YA : Apakah pengguna menggunakan email yang terkait dengan Akun Google mereka untuk login ke platform Anda? (Pengguna memutuskan dengan memilih YA atau TIDAK)
- YA : Apakah pengguna memiliki akun yang cocok dalam sistem autentikasi Anda? (
check intent
dipanggil untuk mengonfirmasi)- YA :
get intent
dipanggil dan akun ditautkan jika intent berhasil dikembalikan. - TIDAK : Buat Akun Baru? (Pengguna memutuskan dengan memilih YA atau TIDAK)
- YA:
create intent
dipanggil dan akun ditautkan jika intent pembuatan berhasil ditampilkan. - TIDAK : Alur OAuth Web dipicu, pengguna diarahkan ke browser mereka, dan pengguna diberi opsi untuk menautkan dengan email yang berbeda.
- YA:
- YA :
- TIDAK : Alur OAuth Web dipicu, pengguna diarahkan ke browser mereka, dan pengguna diberi opsi untuk menautkan dengan email yang berbeda.
- YA : Apakah pengguna memiliki akun yang cocok dalam sistem autentikasi Anda? (
- TIDAK : Apakah pengguna memiliki akun yang cocok di sistem autentikasi? (
check intent
dipanggil untuk mengonfirmasi)- YA :
get intent
dipanggil dan akun ditautkan jika intent berhasil dikembalikan. - TIDAK:
create intent
akan dipanggil dan akun akan ditautkan jika intent pembuatan berhasil ditampilkan.
- YA :
- YA : Apakah pengguna menggunakan email yang terkait dengan Akun Google mereka untuk login ke platform Anda? (Pengguna memutuskan dengan memilih YA atau TIDAK)
检查现有用户帐号(检查 intent)
在用户同意访问其 Google 个人资料后,Google 会发送一个请求,其中包含 Google 用户身份的签名断言。该断言包含用户的 Google 帐号 ID、姓名和电子邮件地址。为您的项目配置的令牌交换端点会处理该请求。
如果您的身份验证系统中已存在相应的 Google 帐号,则您的令牌交换端点会返回 account_found=true
。如果 Google 帐号与现有用户不匹配,那么您的令牌交换端点会返回 account_found=false
的 HTTP 404 Not Found 错误。
请求的格式如下:
POST /token HTTP/1.1 Host: oauth2.example.com Content-Type: application/x-www-form-urlencoded grant_type=urn:ietf:params:oauth:grant-type:jwt-bearer&intent=check&assertion=JWT&scope=SCOPES&client_id=GOOGLE_CLIENT_ID&client_secret=GOOGLE_CLIENT_SECRET
您的令牌交换端点必须能够处理以下参数:
令牌端点参数 | |
---|---|
intent |
对于这些请求,此参数的值为 check 。 |
grant_type |
要交换的令牌的类型。对于这些请求,此参数的值为 urn:ietf:params:oauth:grant-type:jwt-bearer 。 |
assertion |
一个 JSON Web 令牌 (JWT),用于提供 Google 用户身份的签名断言。JWT 包含用户的 Google 帐号 ID、姓名和电子邮件地址等信息。 |
client_id |
您分配给 Google 的客户端 ID。 |
client_secret |
您分配给 Google 的客户端密钥。 |
为了响应 check
intent 请求,您的令牌交换端点必须执行以下步骤:
- 验证并解码 JWT 断言。
- 检查您的身份验证系统中是否已存在该 Google 帐号。
验证并解码JWT断言
您可以使用针对您的语言的JWT解码库来验证和解码JWT断言。使用Google的JWK或PEM格式的公钥来验证令牌的签名。
解码后,JWT断言类似于以下示例:
{ "sub": "1234567890", // The unique ID of the user's Google Account "iss": "https://accounts.google.com", // The assertion's issuer "aud": "123-abc.apps.googleusercontent.com", // Your server's client ID "iat": 233366400, // Unix timestamp of the assertion's creation time "exp": 233370000, // Unix timestamp of the assertion's expiration time "name": "Jan Jansen", "given_name": "Jan", "family_name": "Jansen", "email": "jan@gmail.com", // If present, the user's email address "email_verified": true, // true, if Google has verified the email address "hd": "example.com", // If present, the host domain of the user's GSuite email address // If present, a URL to user's profile picture "picture": "https://lh3.googleusercontent.com/a-/AOh14GjlTnZKHAeb94A-FmEbwZv7uJD986VOF1mJGb2YYQ", "locale": "en_US" // User's locale, from browser or phone settings }
除了验证令牌的签名外,还要验证断言的颁发者( iss
字段)为https://accounts.google.com
,受众( aud
字段)是您分配的客户端ID,并且令牌尚未过期( exp
场地)。
使用email
, email_verified
和hd
字段,您可以确定Google是否托管电子邮件地址并对其具有权威性。如果Google具有权威性,则当前已知该用户为合法帐户所有者,您可以跳过密码或其他挑战方法。否则,可以使用这些方法在链接之前验证帐户。
Google具有权威性的情况:
-
email
后缀为@gmail.com
,这是一个Gmail帐户。 -
email_verified
为true并且设置了hd
,这是一个G Suite帐户。
用户可以在不使用Gmail或G Suite的情况下注册Google帐户。如果email
不包含@gmail.com
后缀,并且没有hd
则Google并不具有权威性,建议您使用密码或其他验证方法来验证用户。当Google在创建Google帐户时最初验证了用户时, email_verfied
也可能为true,但是此后第三方电子邮件帐户的所有权可能已更改。
检查您的身份验证系统中是否已存在该 Google 帐号
检查是否满足以下任一条件:
- Google 帐号 ID 可在用户的数据库中找到,可在断言的
sub
字段找到。 - 断言中的电子邮件地址与您的用户数据库中的用户匹配。
如果其中任一条件为 true,则表示用户已注册。在这种情况下,系统将返回如下所示的响应:
HTTP/1.1 200 Success Content-Type: application/json;charset=UTF-8 { "account_found":"true", }
如果断言中指定的 Google 帐号 ID 和电子邮件地址都与用户数据库中的用户不匹配,则表示用户尚未注册。在这种情况下,您的令牌交换端点需要使用包含 "account_found": "false"
的 HTTP 404 错误进行响应,如以下示例所示:
HTTP/1.1 404 Not found Content-Type: application/json;charset=UTF-8 { "account_found":"false", }
Menangani penautan otomatis (dapatkan intent)
Setelah pengguna memberikan izin untuk mengakses profil Google mereka, Google akan mengirimkan permintaan yang berisi pernyataan bertanda tangan dari identitas pengguna Google. Pernyataan berisi informasi yang menyertakan ID, nama, dan alamat email Google pengguna. Endpoint pertukaran token yang dikonfigurasi untuk project Anda menangani permintaan tersebut.
Jika Akun Google yang sesuai sudah ada di sistem autentikasi, endpoint pertukaran token akan menampilkan token untuk pengguna. Jika Akun Google tidak cocok dengan pengguna yang sudah ada, endpoint pertukaran token akan menampilkan error linking_error
dan login_hint
opsional.
Permintaan memiliki format berikut:
POST /token HTTP/1.1 Host: oauth2.example.com Content-Type: application/x-www-form-urlencoded grant_type=urn:ietf:params:oauth:grant-type:jwt-bearer&intent=get&assertion=JWT&scope=SCOPES&client_id=GOOGLE_CLIENT_ID&client_secret=GOOGLE_CLIENT_SECRET
Endpoint pertukaran token Anda harus dapat menangani parameter berikut:
Parameter endpoint token | |
---|---|
intent |
Untuk permintaan ini, nilai parameter ini adalah get . |
grant_type |
Jenis token yang dipertukarkan. Untuk permintaan ini, parameter ini memiliki nilai urn:ietf:params:oauth:grant-type:jwt-bearer . |
assertion |
Token Web JSON (JWT) yang memberikan pernyataan bertanda tangan tentang identitas pengguna Google. JWT berisi informasi yang mencakup ID, nama, dan alamat email Google milik pengguna. |
scope |
Opsional: Cakupan apa pun yang telah Anda konfigurasi oleh Google untuk diminta dari pengguna. |
client_id |
Client ID yang Anda tetapkan ke Google. |
client_secret |
Rahasia klien yang Anda tetapkan ke Google. |
Untuk merespons permintaan intent get
, endpoint pertukaran token Anda harus melakukan langkah-langkah berikut:
- Memvalidasi dan mendekode pernyataan JWT.
- Periksa apakah Akun Google sudah ada di sistem autentikasi.
验证并解码JWT断言
您可以使用针对您的语言的JWT解码库来验证和解码JWT断言。使用Google的JWK或PEM格式的公钥来验证令牌的签名。
解码后,JWT断言类似于以下示例:
{ "sub": "1234567890", // The unique ID of the user's Google Account "iss": "https://accounts.google.com", // The assertion's issuer "aud": "123-abc.apps.googleusercontent.com", // Your server's client ID "iat": 233366400, // Unix timestamp of the assertion's creation time "exp": 233370000, // Unix timestamp of the assertion's expiration time "name": "Jan Jansen", "given_name": "Jan", "family_name": "Jansen", "email": "jan@gmail.com", // If present, the user's email address "email_verified": true, // true, if Google has verified the email address "hd": "example.com", // If present, the host domain of the user's GSuite email address // If present, a URL to user's profile picture "picture": "https://lh3.googleusercontent.com/a-/AOh14GjlTnZKHAeb94A-FmEbwZv7uJD986VOF1mJGb2YYQ", "locale": "en_US" // User's locale, from browser or phone settings }
除了验证令牌的签名外,还要验证断言的颁发者( iss
字段)为https://accounts.google.com
,受众( aud
字段)是您分配的客户端ID,并且令牌尚未过期( exp
场地)。
使用email
, email_verified
和hd
字段,您可以确定Google是否托管电子邮件地址并对其具有权威性。如果Google具有权威性,则当前已知该用户为合法帐户所有者,您可以跳过密码或其他挑战方法。否则,可以使用这些方法在链接之前验证帐户。
Google具有权威性的情况:
-
email
后缀为@gmail.com
,这是一个Gmail帐户。 -
email_verified
为true并且设置了hd
,这是一个G Suite帐户。
用户可以在不使用Gmail或G Suite的情况下注册Google帐户。如果email
不包含@gmail.com
后缀,并且没有hd
则Google并不具有权威性,建议您使用密码或其他验证方法来验证用户。当Google在创建Google帐户时最初验证了用户时, email_verfied
也可能为true,但是此后第三方电子邮件帐户的所有权可能已更改。
Memeriksa apakah Akun Google sudah ada di sistem autentikasi
Periksa apakah salah satu dari kondisi berikut benar:
- ID Akun Google, yang ada di kolom
sub
pernyataan, ada dalam database pengguna Anda. - Alamat email dalam pernyataan cocok dengan pengguna di database pengguna Anda.
Jika akun ditemukan untuk pengguna, berikan token akses dan tampilkan nilai dalam objek JSON dalam isi respons HTTPS Anda, seperti dalam contoh berikut:
{ "token_type": "Bearer", "access_token": "ACCESS_TOKEN", "expires_in": SECONDS_TO_EXPIRATION }
Dalam beberapa kasus, penautan akun berdasarkan token ID mungkin gagal bagi pengguna. Jika dilakukan karena alasan apa pun, endpoint pertukaran token harus membalas dengan error HTTP 401 yang menentukan error=linking_error
, seperti yang ditunjukkan contoh berikut:
HTTP/1.1 401 Unauthorized Content-Type: application/json;charset=UTF-8 { "error":"linking_error", "login_hint":"foo@bar.com" }
Saat Google menerima respons error 401 dengan linking_error
, Google mengirimkan pengguna ke endpoint otorisasi dengan login_hint
sebagai parameter. Pengguna
menyelesaikan penautan akun menggunakan alur penautan OAuth di browser mereka.
通过 Google 登录功能创建帐号(创建 intent)
当用户需要在您的服务上创建帐号时,Google 会向您的令牌交换端点发出请求,并指定 intent=create
。
请求的格式如下:
POST /token HTTP/1.1 Host: oauth2.example.com Content-Type: application/x-www-form-urlencoded response_type=token&grant_type=urn:ietf:params:oauth:grant-type:jwt-bearer&scope=SCOPES&intent=create&assertion=JWT&client_id=GOOGLE_CLIENT_ID&client_secret=GOOGLE_CLIENT_SECRET
您的令牌交换端点必须能够处理以下参数:
令牌端点参数 | |
---|---|
intent |
对于这些请求,此参数的值为 create 。 |
grant_type |
要交换的令牌的类型。对于这些请求,此参数的值为 urn:ietf:params:oauth:grant-type:jwt-bearer 。 |
assertion |
一个 JSON Web 令牌 (JWT),用于提供 Google 用户身份的签名断言。JWT 包含用户的 Google 帐号 ID、姓名和电子邮件地址等信息。 |
client_id |
您分配给 Google 的客户端 ID。 |
client_secret |
您分配给 Google 的客户端密钥。 |
assertion
参数中的 JWT 包含用户的 Google 帐号 ID、名称和电子邮件地址,您可以使用这些信息在服务中创建新帐号。
为了响应 create
intent 请求,您的令牌交换端点必须执行以下步骤:
- 验证并解码 JWT 断言。
- 验证用户信息并创建新帐号。
验证并解码JWT断言
您可以使用针对您的语言的JWT解码库来验证和解码JWT断言。使用Google的JWK或PEM格式的公钥来验证令牌的签名。
解码后,JWT断言类似于以下示例:
{ "sub": "1234567890", // The unique ID of the user's Google Account "iss": "https://accounts.google.com", // The assertion's issuer "aud": "123-abc.apps.googleusercontent.com", // Your server's client ID "iat": 233366400, // Unix timestamp of the assertion's creation time "exp": 233370000, // Unix timestamp of the assertion's expiration time "name": "Jan Jansen", "given_name": "Jan", "family_name": "Jansen", "email": "jan@gmail.com", // If present, the user's email address "email_verified": true, // true, if Google has verified the email address "hd": "example.com", // If present, the host domain of the user's GSuite email address // If present, a URL to user's profile picture "picture": "https://lh3.googleusercontent.com/a-/AOh14GjlTnZKHAeb94A-FmEbwZv7uJD986VOF1mJGb2YYQ", "locale": "en_US" // User's locale, from browser or phone settings }
除了验证令牌的签名外,还要验证断言的颁发者( iss
字段)为https://accounts.google.com
,受众( aud
字段)是您分配的客户端ID,并且令牌尚未过期( exp
场地)。
使用email
, email_verified
和hd
字段,您可以确定Google是否托管电子邮件地址并对其具有权威性。如果Google具有权威性,则当前已知该用户为合法帐户所有者,您可以跳过密码或其他挑战方法。否则,可以使用这些方法在链接之前验证帐户。
Google具有权威性的情况:
-
email
后缀为@gmail.com
,这是一个Gmail帐户。 -
email_verified
为true并且设置了hd
,这是一个G Suite帐户。
用户可以在不使用Gmail或G Suite的情况下注册Google帐户。如果email
不包含@gmail.com
后缀,并且没有hd
则Google并不具有权威性,建议您使用密码或其他验证方法来验证用户。当Google在创建Google帐户时最初验证了用户时, email_verfied
也可能为true,但是此后第三方电子邮件帐户的所有权可能已更改。
验证用户信息并创建新帐号
检查是否满足以下任一条件:
- Google 帐号 ID 可在用户的数据库中找到,可在断言的
sub
字段找到。 - 断言中的电子邮件地址与您的用户数据库中的用户匹配。
如果任一条件为 true,请提示用户将其现有帐号与其 Google 帐号相关联。为此,请对请求进行响应,并提供指定 error=linking_error
并将用户的电子邮件地址作为 login_hint
的 HTTP 401 错误。以下是一个示例响应:
HTTP/1.1 401 Unauthorized Content-Type: application/json;charset=UTF-8 { "error":"linking_error", "login_hint":"foo@bar.com" }
Google 收到包含 linking_error
的 401 错误响应后,会将用户作为授权参数 login_hint
发送到您的授权端点。用户在浏览器中使用 OAuth 关联流程完成帐号关联。
如果两个条件都不满足,请使用 JWT 中提供的信息创建新的用户帐号。新帐号通常不会设置密码。建议您将 Google 登录功能添加到其他平台,以便用户能够在应用界面使用 Google 帐号登录。或者,您也可以通过电子邮件向用户发送一个启动密码恢复流程的链接,以便用户设置密码以在其他平台上登录。
创建完成后,发出访问令牌 ,并在 HTTPS 响应的正文中以 JSON 对象形式返回值,如以下示例所示:
{ "token_type": "Bearer", "access_token": "ACCESS_TOKEN", "expires_in": SECONDS_TO_EXPIRATION }
Mendapatkan Client ID Google API Anda
Anda akan diminta untuk memberikan Client ID Google API selama proses pendaftaran Penautan Akun.
Untuk mendapatkan Client ID API menggunakan project yang Anda buat saat menyelesaikan langkah-langkah Penautan OAuth. Caranya, selesaikan langkah-langkah berikut:
- Buka halaman Credentials di konsol API Google.
Buat atau pilih project Google API.
Jika project Anda tidak memiliki Client ID untuk Jenis aplikasi Web, klik Buat kredensial > Client ID OAuth untuk membuatnya. Pastikan untuk menyertakan domain situs Anda di kotak Asal JavaScript yang sah. Saat melakukan pengujian atau pengembangan lokal, Anda harus menambahkan
http://localhost
danhttp://localhost:<port_number>
ke kolom Asal JavaScript yang sah.
Memvalidasi implementasi
Anda dapat memvalidasi implementasi Anda dengan menggunakan OAuth 2.0 Playground alat.
Pada alat, lakukan langkah-langkah berikut:
- Klik Konfigurasi untuk membuka jendela Configuration OAuth 2.0.
- Di bidang aliran OAuth, pilih Client-side.
- Di bidang OAuth endpoint, pilih Custom.
- Tentukan titik akhir OAuth 2.0 dan ID klien yang Anda tetapkan ke Google di bidang yang sesuai.
- Pada bagian Langkah 1, tidak memilih lingkup Google. Sebagai gantinya, biarkan bidang ini kosong atau ketik cakupan yang valid untuk server Anda (atau string arbitrer jika Anda tidak menggunakan cakupan OAuth). Setelah selesai, klik Otorisasi API.
- Dalam Langkah 2 dan Langkah 3 bagian, melalui aliran OAuth 2.0 dan memverifikasi bahwa setiap langkah bekerja sebagaimana dimaksud.
Anda dapat memvalidasi implementasi Anda dengan menggunakan Akun Google Menghubungkan Demo alat.
Pada alat, lakukan langkah-langkah berikut:
- Klik Sign-in dengan tombol Google.
- Pilih akun yang ingin Anda tautkan.
- Masukkan ID layanan.
- Secara opsional, masukkan satu atau beberapa cakupan yang akan Anda minta aksesnya.
- Klik Mulai Demo.
- Saat diminta, konfirmasikan bahwa Anda dapat menyetujui dan menolak permintaan penautan.
- Konfirmasikan bahwa Anda dialihkan ke platform Anda.