Akun ditautkan menggunakan alur implisit dan kode otorisasi OAuth 2.0 standar industri. Layanan Anda harus mendukung endpoint otorisasi dan pertukaran token yang mematuhi OAuth 2.0.
In the implicit flow, Google opens your authorization endpoint in the user's browser. After successful sign in, you return a long-lived access token to Google. This access token is now included in every request sent from Google.
In the authorization code flow, you need two endpoints:
The authorization endpoint, which presents the sign-in UI to your users that aren't already signed in. The authorization endpoint also creates a short-lived authorization code to record users' consent to the requested access.
The token exchange endpoint, which is responsible for two types of exchanges:
- Exchanges an authorization code for a long-lived refresh token and a short-lived access token. This exchange happens when the user goes through the account linking flow.
- Exchanges a long-lived refresh token for a short-lived access token. This exchange happens when Google needs a new access token because the one it had expired.
Choose an OAuth 2.0 flow
Although the implicit flow is simpler to implement, Google recommends that access tokens issued by the implicit flow never expire. This is because the user is forced to link their account again after a token expires with the implicit flow. If you need token expiration for security reasons, we strongly recommend that you use the authorization code flow instead.
Design guidelines
This section describes the design requirements and recommendations for the user screen that you host for OAuth linking flows. After it's called by Google's app, your platform displays a sign in to Google page and account linking consent screen to the user. The user is directed back to Google's app after giving their consent to link accounts.
Requirements
- You must communicate that the user’s account will be linked to Google, not a specific Google product like Google Home or Google Assistant.
Recommendations
We recommend that you do the following:
Display Google's Privacy Policy. Include a link to Google’s Privacy Policy on the consent screen.
Data to be shared. Use clear and concise language to tell the user what data of theirs Google requires and why.
Clear call-to-action. State a clear call-to-action on your consent screen, such as “Agree and link.” This is because users need to understand what data they're required to share with Google to link their accounts.
Ability to cancel. Provide a way for users to go back or cancel, if they choose not to link.
Clear sign-in process. Ensure that users have clear method for signing in to their Google account, such as fields for their username and password or Sign in with Google.
Ability to unlink. Offer a mechanism for users to unlink, such as a URL to their account settings on your platform. Alternatively, you can include a link to Google Account where users can manage their linked account.
Ability to change user account. Suggest a method for users to switch their account(s). This is especially beneficial if users tend to have multiple accounts.
- If a user must close the consent screen to switch accounts, send a recoverable error to Google so the user can sign in to the desired account with OAuth linking and the implicit flow.
Include your logo. Display your company logo on the consent screen. Use your style guidelines to place your logo. If you wish to also display Google's logo, see Logos and trademarks.
Create the project
To create your project to use account linking:
- Go to the Google API Console.
- Click Create project.
- Enter a name or accept the generated suggestion.
- Confirm or edit any remaining fields.
- Click Create.
To view your project ID:
- Go to the Google API Console.
- Find your project in the table on the landing page. The project ID appears in the ID column.
Configure your OAuth Consent Screen
The Google Account Linking process includes a consent screen which tells users the application requesting access to their data, what kind of data they are asking for and the terms that apply. You will need to configure your OAuth consent screen before generating a Google API client ID.
- Open the OAuth consent screen page of the Google APIs console.
- If prompted, select the project you just created.
On the "OAuth consent screen" page, fill out the form and click the “Save” button.
Application name: The name of the application asking for consent. The name should accurately reflect your application and be consistent with the application name users see elsewhere. The application name will be shown on the Account Linking consent screen.
Application logo: An image on the consent screen that will help users recognize your app. The logo is shown on Account linking consent screen and on account settings
Support email: For users to contact you with questions about their consent.
Scopes for Google APIs: Scopes allow your application to access your user's private Google data. For the Google Account Linking use case, default scope (email, profile, openid) is sufficient, you don’t need to add any sensitive scopes. It is generally a best practice to request scopes incrementally, at the time access is required, rather than up front. Learn more.
Authorized domains: To protect you and your users, Google only allows applications that authenticate using OAuth to use Authorized Domains. Your applications' links must be hosted on Authorized Domains. Learn more.
Application Homepage link: Home page for your application. Must be hosted on an Authorized Domain.
Application Privacy Policy link: Shown on Google Account Linking consent screen. Must be hosted on an Authorized Domain.
Application Terms of Service link (Optional): Must be hosted on an Authorized Domain.
Figure 1. Google Account Linking Consent Screen for a fictitious Application, Tunery
Check "Verification Status", if your application needs verification then click the "Submit For Verification" button to submit your application for verification. Refer to OAuth verification requirements for details.
Menerapkan server OAuth
Implementasi server OAuth 2.0 dari alur kode otorisasi terdiri dari dua endpoint, yang disediakan oleh layanan Anda melalui HTTPS. Endpoint pertama adalah endpoint otorisasi, yang bertanggung jawab untuk menemukan atau mendapatkan persetujuan dari pengguna untuk akses data. Endpoint otorisasi menampilkan UI login ke pengguna yang belum login dan mencatat izin akses yang diminta. Endpoint kedua adalah endpoint pertukaran token, yang digunakan untuk memperoleh string terenkripsi, yang disebut token, yang mengotorisasi pengguna untuk mengakses layanan Anda.
Bila aplikasi Google perlu memanggil salah satu API layanan Anda, Google akan menggunakan kedua endpoint tersebut untuk mendapatkan izin dari pengguna memanggil API ini atas nama mereka.
Sesi alur kode otorisasi OAuth 2.0 yang dimulai oleh Google memiliki alur berikut:
- Google akan membuka endpoint otorisasi Anda di browser pengguna. Jika alur dimulai di perangkat khusus suara untuk Action, Google mentransfer dieksekusi ke ponsel.
- Pengguna akan login, jika belum login, dan memberikan izin kepada Google untuk mengakses data mereka dengan API Anda, jika mereka belum memberikan izin.
- Layanan Anda membuat kode otorisasi dan mengembalikannya ke Google. Yang akan dilakukan jadi, alihkan browser pengguna kembali ke Google dengan kode otorisasi dilampirkan pada permintaan.
- Google mengirimkan kode otorisasi ke endpoint pertukaran token Anda, yang akan memverifikasi keaslian kode dan menampilkan token akses serta token refresh. Token akses adalah token berumur pendek yang dibutuhkan layanan Anda diterima sebagai kredensial untuk mengakses API. Token refresh berumur panjang yang dapat disimpan dan digunakan Google untuk mendapatkan token akses baru ketika berakhir.
- Setelah pengguna menyelesaikan alur penautan akun, setiap langkah yang dikirim dari Google berisi token akses.
Menangani permintaan otorisasi
Saat Anda perlu melakukan penautan akun menggunakan kode otorisasi OAuth 2.0 , Google mengirim pengguna ke endpoint otorisasi Anda dengan permintaan yang mencakup parameter berikut:
| Parameter endpoint otorisasi | |
|---|---|
client_id |
Client-ID yang Anda tetapkan ke Google. |
redirect_uri |
URL tempat Anda mengirim respons atas permintaan ini. |
state |
Nilai pembukuan yang diteruskan kembali ke Google tanpa berubah dalam URI pengalihan. |
scope |
Opsional: Serangkaian string cakupan yang dipisahkan spasi yang menentukan data yang otorisasinya diminta oleh Google. |
response_type |
Jenis nilai yang akan ditampilkan dalam respons. Untuk OAuth 2.0
alur kode otorisasi, jenis responsnya selalu code.
|
user_locale |
Setelan bahasa Akun Google di RFC5646 , digunakan untuk melokalkan konten Anda ke bahasa pilihan pengguna. |
Misalnya, jika endpoint otorisasi Anda tersedia di
https://myservice.example.com/auth, permintaan mungkin akan terlihat seperti berikut:
GET https://myservice.example.com/auth?client_id=GOOGLE_CLIENT_ID&redirect_uri=REDIRECT_URI&state=STATE_STRING&scope=REQUESTED_SCOPES&response_type=code&user_locale=LOCALE
Agar endpoint otorisasi Anda dapat menangani permintaan login, lakukan hal berikut langkah:
- Pastikan bahwa
client_idcocok dengan Client-ID yang Anda tetapkan ke Google, danredirect_uricocok dengan URL alihan yang diberikan oleh Google untuk layanan Anda. Pemeriksaan ini penting untuk mencegah pemberian akses ke aplikasi klien yang tidak diinginkan atau salah dikonfigurasi. Jika Anda mendukung beberapa OAuth 2.0 flow, juga mengonfirmasi bahwaresponse_typeadalahcode. - Periksa apakah pengguna sudah login ke layanan Anda. Jika pengguna tidak {i>login<i}, menyelesaikan alur login atau pendaftaran layanan Anda.
- Buat kode otorisasi untuk digunakan Google guna mengakses API Anda. Kode otorisasi dapat berupa nilai string apa pun, tetapi harus secara unik mewakili pengguna, klien yang menjadi tujuan token, dan masa berlaku kode waktu, dan itu tidak boleh ditebak. Anda biasanya memberikan otorisasi kode yang berakhir masa berlakunya setelah sekitar 10 menit.
- Konfirmasi bahwa URL yang ditentukan oleh parameter
redirect_urimemiliki formulir berikut:https://oauth-redirect.googleusercontent.com/r/YOUR_PROJECT_ID https://oauth-redirect-sandbox.googleusercontent.com/r/YOUR_PROJECT_ID
- Alihkan browser pengguna ke URL yang ditentukan oleh
Parameter
redirect_uri. Sertakan kode otorisasi yang baru saja dibuat dan nilai status asli yang tidak dimodifikasi saat Anda mengalihkan dengan menambahkan parametercodedanstate. Berikut adalah contoh URL yang dihasilkan:https://oauth-redirect.googleusercontent.com/r/YOUR_PROJECT_ID?code=AUTHORIZATION_CODE&state=STATE_STRING
Menangani permintaan pertukaran token
Endpoint pertukaran token layanan Anda bertanggung jawab atas dua jenis token pertukaran:
- Tukar kode otorisasi dengan token akses dan token refresh
- Menukarkan token refresh dengan token akses
Permintaan pertukaran token mencakup parameter berikut:
| Parameter endpoint pertukaran token | |
|---|---|
client_id |
String yang mengidentifikasi asal permintaan sebagai Google. String ini harus terdaftar dalam sistem Anda sebagai pengenal unik Google. |
client_secret |
String rahasia yang Anda daftarkan ke Google untuk layanan Anda. |
grant_type |
Jenis token yang dipertukarkan. Bisa
authorization_code atau refresh_token. |
code |
Jika grant_type=authorization_code, parameter ini adalah
kode yang diterima Google dari proses login atau pertukaran token Anda
endpoint. |
redirect_uri |
Jika grant_type=authorization_code, parameter ini adalah
URL yang digunakan dalam permintaan otorisasi awal. |
refresh_token |
Jika grant_type=refresh_token, parameter ini adalah
token refresh yang diterima Google dari endpoint pertukaran token Anda. |
Tukar kode otorisasi dengan token akses dan token refresh
Setelah pengguna login dan endpoint otorisasi Anda menampilkan histori kode otorisasi ke Google, Google mengirimkan permintaan ke pertukaran token endpoint untuk menukar kode otorisasi dengan token akses, sebelumnya yang benar.
Untuk permintaan ini, nilai grant_type adalah authorization_code, dan
nilai code adalah nilai kode otorisasi yang sebelumnya Anda berikan
ke Google. Berikut ini contoh permintaan untuk menukar
kode otorisasi untuk token akses dan token refresh:
POST /token HTTP/1.1 Host: oauth2.example.com Content-Type: application/x-www-form-urlencoded client_id=GOOGLE_CLIENT_ID&client_secret=GOOGLE_CLIENT_SECRET&grant_type=authorization_code&code=AUTHORIZATION_CODE&redirect_uri=REDIRECT_URI
Untuk menukar kode otorisasi dengan token akses dan token refresh,
endpoint pertukaran token merespons permintaan POST dengan menjalankan
langkah:
- Pastikan bahwa
client_idmengidentifikasi asal permintaan sebagai asal origin, dan bahwaclient_secretcocok dengan nilai yang diharapkan. - Verifikasi bahwa kode otorisasi valid dan masih berlaku, serta bahwa ID klien yang ditentukan dalam permintaan cocok dengan ID klien yang terkait dengan kode otorisasi Anda.
- Pastikan URL yang ditentukan oleh parameter
redirect_urisama dengan nilai yang digunakan dalam permintaan otorisasi awal. - Jika Anda tidak dapat memverifikasi semua kriteria di atas, tampilkan permintaan HTTP
Error 400 Bad Request dengan
{"error": "invalid_grant"}sebagai isi. - Jika tidak, gunakan ID pengguna dari kode otorisasi untuk membuat pembaruan dan token akses. Token ini dapat berupa nilai string apa pun, tetapi harus secara unik mewakili pengguna dan klien yang menjadi tujuan token, dan mereka harus tidak dapat ditebak. Untuk token akses, catat juga waktu kedaluwarsa token, yang biasanya satu jam setelah Anda menerbitkan token. Token refresh tidak memiliki tanggal habis masa berlaku.
- Tampilkan objek JSON berikut dalam isi respons HTTPS:
{ "token_type": "Bearer", "access_token": "ACCESS_TOKEN", "refresh_token": "REFRESH_TOKEN", "expires_in": SECONDS_TO_EXPIRATION }
Google menyimpan token akses dan token refresh untuk pengguna dan data akhir masa berlaku token akses. Saat token akses kedaluwarsa, Google akan menggunakan token refresh untuk mendapatkan token akses baru dari endpoint pertukaran token Anda.
Menukarkan token refresh dengan token akses
Saat masa berlaku token akses habis, Google akan mengirimkan permintaan ke pertukaran token Anda untuk menukar token refresh dengan token akses baru.
Untuk permintaan ini, nilai grant_type adalah refresh_token, dan nilai
dari refresh_token adalah nilai token refresh yang sebelumnya Anda berikan
Google. Berikut adalah contoh permintaan untuk menukar token refresh
untuk token akses:
POST /token HTTP/1.1 Host: oauth2.example.com Content-Type: application/x-www-form-urlencoded client_id=GOOGLE_CLIENT_ID&client_secret=GOOGLE_CLIENT_SECRET&grant_type=refresh_token&refresh_token=REFRESH_TOKEN
Guna menukar token refresh dengan token akses, endpoint pertukaran token Anda
merespons permintaan POST dengan menjalankan langkah-langkah berikut:
- Verifikasi bahwa
client_idmengidentifikasi asal permintaan sebagai Google, dan bahwaclient_secretcocok dengan nilai yang diharapkan. - Pastikan token refresh valid, dan client ID yang ditentukan di permintaan cocok dengan client ID yang terkait dengan token refresh.
- Jika Anda tidak dapat memverifikasi semua kriteria di atas, tampilkan HTTP 400
Error Permintaan Buruk dengan
{"error": "invalid_grant"}sebagai isi. - Jika tidak, gunakan ID pengguna dari token refresh untuk membuat akses sebelumnya yang benar. Token ini dapat berupa nilai string apa pun, tetapi harus secara unik mewakili pengguna dan klien yang menjadi tujuan token, dan mereka tidak boleh dapat ditebak. Untuk token akses, catat juga waktu kedaluwarsa token, biasanya satu jam setelah Anda menerbitkan token.
- Tampilkan objek JSON berikut dalam isi HTTPS
respons:
{ "token_type": "Bearer", "access_token": "ACCESS_TOKEN", "expiration_in": SECONDS_TO_EXPIRATION }
Handle userinfo requests
The userinfo endpoint is an OAuth 2.0 protected resource that return claims about the linked user. Implementing and hosting the userinfo endpoint is optional, except for the following use cases:
- Linked Account Sign-In with Google One Tap.
- Frictionless subscription on AndroidTV.
After the access token has been successfully retrieved from your token endpoint, Google sends a request to your userinfo endpoint to retrieve basic profile information about the linked user.
| userinfo endpoint request headers | |
|---|---|
Authorization header |
The access token of type Bearer. |
For example, if your userinfo endpoint is available at
https://myservice.example.com/userinfo, a request might look like the following:
GET /userinfo HTTP/1.1 Host: myservice.example.com Authorization: Bearer ACCESS_TOKEN
For your userinfo endpoint to handle requests, do the following steps:
- Extract access token from the Authorization header and return information for the user associated with the access token.
- If the access token is invalid, return an HTTP 401 Unauthorized error with using the
WWW-AuthenticateResponse Header. Below is an example of a userinfo error response: If a 401 Unauthorized, or any other unsuccessful error response is returned during the linking process, the error will be non-recoverable, the retrieved token will be discarded and the user will have to initiate the linking process again.HTTP/1.1 401 Unauthorized WWW-Authenticate: error="invalid_token", error_description="The Access Token expired"
If the access token is valid, return and HTTP 200 response with the following JSON object in the body of the HTTPS response:
If your userinfo endpoint returns an HTTP 200 success response, the retrieved token and claims are registered against the user's Google account.{ "sub": "USER_UUID", "email": "EMAIL_ADDRESS", "given_name": "FIRST_NAME", "family_name": "LAST_NAME", "name": "FULL_NAME", "picture": "PROFILE_PICTURE", }userinfo endpoint response subA unique ID that identifies the user in your system. emailEmail address of the user. given_nameOptional: First name of the user. family_nameOptional: Last name of the user. nameOptional: Full name of the user. pictureOptional: Profile picture of the user.
Memvalidasi implementasi
Anda dapat memvalidasi penerapan menggunakan alat OAuth 2.0 Playground.
Di alat ini, lakukan langkah-langkah berikut:
- Klik Configuration untuk membuka jendela OAuth 2.0 Configuration.
- Di kolom OAuth flow, pilih Client-side.
- Di kolom OAuth Endpoints, pilih Custom.
- Tentukan endpoint OAuth 2.0 dan client ID yang Anda tetapkan ke Google di kolom yang sesuai.
- Di bagian Langkah 1, jangan pilih cakupan Google apa pun. Sebagai gantinya, biarkan kolom ini kosong atau ketik cakupan yang valid untuk server Anda (atau string arbitrer jika Anda tidak menggunakan cakupan OAuth). Setelah selesai, klik Otorisasi API.
- Di bagian Langkah 2 dan Langkah 3, ikuti alur OAuth 2.0 dan verifikasi bahwa setiap langkah berfungsi sebagaimana mestinya.
Anda dapat memvalidasi penerapan menggunakan alat Demo Penautan Akun Google.
Di alat tersebut, lakukan langkah-langkah berikut:
- Klik tombol Login dengan Google.
- Pilih akun yang ingin ditautkan.
- Masukkan ID layanan.
- Secara opsional, masukkan satu atau beberapa cakupan yang akan Anda minta aksesnya.
- Klik Mulai Demo.
- Jika diminta, konfirmasi bahwa Anda dapat mengizinkan dan menolak permintaan penautan.
- Pastikan Anda dialihkan ke platform Anda.