การลิงก์บัญชี Google ช่วยให้เจ้าของบัญชี Google เชื่อมต่อกับบริการและแชร์ข้อมูลกับ Google ได้อย่างรวดเร็วและปลอดภัย
การลงชื่อเข้าใช้บัญชีที่ลิงก์จะเปิดใช้การลงชื่อเข้าใช้ด้วย One Tap ด้วย Google ให้กับผู้ใช้ที่ลิงก์บัญชี Google ของตนกับบริการของคุณอยู่แล้ว ซึ่งจะช่วยปรับปรุงประสบการณ์ของผู้ใช้เนื่องจากสามารถลงชื่อเข้าใช้ได้ในคลิกเดียว โดยไม่ต้องป้อนชื่อผู้ใช้และรหัสผ่านอีกครั้ง ทั้งยังลดโอกาสที่ผู้ใช้จะสร้างบัญชีที่ซ้ำกันในบริการของคุณ
ข้อกำหนด
คุณต้องมีคุณสมบัติตรงตามข้อกำหนดต่อไปนี้จึงจะใช้การลงชื่อเข้าใช้บัญชีที่ลิงก์ได้
- คุณมีการใช้งานการลิงก์ OAuth ของบัญชี Google ที่รองรับขั้นตอนรหัสการให้สิทธิ์ OAuth 2.0 การใช้งาน OAuth ต้องมีปลายทางต่อไปนี้
- ปลายทางการให้สิทธิ์เพื่อจัดการคำขอการให้สิทธิ์
- ปลายทางโทเค็นเพื่อจัดการคำขอเข้าถึงและรีเฟรชโทเค็น
- ปลายทาง userinfo เพื่อดึงข้อมูลบัญชีพื้นฐานเกี่ยวกับผู้ใช้ที่ลิงก์ไว้ ซึ่งจะแสดงให้ผู้ใช้เห็นในระหว่างกระบวนการลงชื่อเข้าใช้บัญชีที่ลิงก์
- คุณมีแอป Android
วิธีการทำงาน
สิ่งที่ต้องทำก่อน : ผู้ใช้เคยลิงก์บัญชี Google กับบัญชีของตนในบริการของคุณแล้ว
- คุณเลือกที่จะแสดงบัญชีที่ลิงก์ในระหว่างขั้นตอนการลงชื่อเข้าใช้ด้วย One Tap
- ผู้ใช้จะเห็นข้อความแจ้งให้ลงชื่อเข้าใช้ด้วย One Tap พร้อมตัวเลือกในการลงชื่อเข้าใช้บริการด้วยบัญชีที่ลิงก์ไว้
- หากผู้ใช้เลือกที่จะดำเนินการต่อด้วยบัญชีที่ลิงก์ Google จะส่งคำขอไปยังปลายทางของโทเค็นของคุณเพื่อบันทึกรหัสการให้สิทธิ์ คําขอมีโทเค็นเพื่อการเข้าถึงของผู้ใช้ที่ออกโดยบริการของคุณและรหัสการให้สิทธิ์ของ Google
- คุณแลกเปลี่ยนรหัสการให้สิทธิ์ของ Google เป็นโทเค็น Google ID ซึ่งมีข้อมูลเกี่ยวกับบัญชี Google ของผู้ใช้
- แอปจะได้รับโทเค็นรหัสด้วยเมื่อขั้นตอนเสร็จสิ้น และคุณจับคู่โทเค็นนี้กับตัวระบุผู้ใช้ในโทเค็นรหัสที่เซิร์ฟเวอร์ได้รับเพื่อลงชื่อเข้าใช้แอปให้ผู้ใช้
![การลงชื่อเข้าใช้บัญชีที่ลิงก์](https://developers.google.cn/static/identity/one-tap/android/images/linked-account-signin.png?authuser=3&hl=th)
ใช้งานการลงชื่อเข้าใช้บัญชีที่ลิงก์ในแอป Android ของคุณ
หากต้องการรองรับการลงชื่อเข้าใช้บัญชีที่ลิงก์ในแอป Android ให้ทำตามวิธีการในคู่มือการติดตั้ง Android
จัดการคำขอรหัสการให้สิทธิ์จาก Google
Google จะส่งคำขอ POST ไปยังปลายทางของโทเค็นของคุณเพื่อบันทึกรหัสการให้สิทธิ์ที่คุณแลกเปลี่ยนกับโทเค็นรหัสของผู้ใช้ โดยคําขอมีโทเค็นการเข้าถึงของผู้ใช้และรหัสการให้สิทธิ์ OAuth2 ที่ Google ออก
ก่อนที่จะบันทึกรหัสการให้สิทธิ์ คุณต้องยืนยันโทเค็นเพื่อการเข้าถึงที่คุณให้กับ Google ซึ่งระบุโดย client_id
คำขอ HTTP
ตัวอย่างคำขอ
POST /token HTTP/1.1
Host: server.example.com
Content-Type: application/x-www-form-urlencoded
code=GOOGLE_AUTHORIZATION_CODE
&grant_type=urn:ietf:params:oauth:grant-type:reciprocal
&client_id=CLIENT_ID
&client_secret=CLIENT_SECRET
&access_token=ACCESS_TOKEN
ปลายทางการแลกเปลี่ยนโทเค็นต้องจัดการพารามิเตอร์คำขอต่อไปนี้ได้
พารามิเตอร์ปลายทางของโทเค็น | |
---|---|
code |
ต้องระบุรหัสการให้สิทธิ์ Google OAuth2 |
client_id |
ต้องระบุรหัสไคลเอ็นต์ที่คุณออกให้ Google |
client_secret |
ต้องระบุรหัสลับไคลเอ็นต์ที่ออกให้ Google |
access_token |
จำเป็น โทเค็นเพื่อการเข้าถึงที่คุณออกให้ Google คุณจะใช้หน้านี้เพื่อดูบริบทของผู้ใช้ |
grant_type |
ต้องระบุ คุณต้องกำหนดค่าเป็น urn:ietf:params:oauth:grant-type:reciprocal |
ปลายทางการแลกเปลี่ยนโทเค็นควรตอบสนองต่อคำขอ POST โดยทำตามขั้นตอนต่อไปนี้
- ยืนยันว่ามอบ
access_token
ให้กับ Google ที่client_id
ระบุไว้ - ตอบกลับด้วยการตอบกลับ HTTP 200 (OK) หากคำขอถูกต้องและแลกเปลี่ยนรหัสการให้สิทธิ์เป็นโทเค็น Google ID สำเร็จ หรือให้รหัสข้อผิดพลาด HTTP หากคำขอไม่ถูกต้อง
การตอบสนองของ HTTP
Success
ส่งคืนรหัสสถานะ HTTP 200 OK
ตัวอย่างการตอบกลับความสำเร็จ
HTTP/1.1 200 OK
Content-Type: application/json
Cache-Control: no-store
Pragma: no-cache
{}
ข้อผิดพลาด
ในกรณีที่คำขอ HTTP ไม่ถูกต้อง โปรดตอบกลับด้วยรหัสข้อผิดพลาด HTTP อย่างใดอย่างหนึ่งต่อไปนี้
รหัสสถานะ HTTP | เนื้อความ | คำอธิบาย |
---|---|---|
400 | {"error": "invalid_request"} |
คำขอไม่มีพารามิเตอร์ เซิร์ฟเวอร์จึงดำเนินการตามคำขอไม่ได้ ระบบอาจแสดงผลข้อมูลนี้ด้วยหากคำขอมีพารามิเตอร์ที่ไม่รองรับหรือใช้พารามิเตอร์ซ้ำ |
401 | {"error": "invalid_request"} |
การตรวจสอบสิทธิ์ไคลเอ็นต์ล้มเหลว เช่น หากคำขอมีรหัสไคลเอ็นต์หรือข้อมูลลับที่ไม่ถูกต้อง |
401 | {"error": "invalid_token"}
ใส่คำถามการตรวจสอบสิทธิ์ "WWW-Authentication: Bearer" ในส่วนหัวการตอบกลับ |
โทเค็นเพื่อการเข้าถึงของพาร์ทเนอร์ไม่ถูกต้อง |
403 | {"error": "insufficient_permission"}
ใส่คำถามการตรวจสอบสิทธิ์ "WWW-Authentication: Bearer" ในส่วนหัวการตอบกลับ |
โทเค็นเพื่อการเข้าถึงของพาร์ทเนอร์ไม่มีขอบเขตที่จำเป็นในการดำเนินการ OAuth แบบ Reciprocal |
500 | {"error": "internal_error"} |
ข้อผิดพลาดของเซิร์ฟเวอร์ |
การตอบกลับข้อผิดพลาดควรมีช่องต่อไปนี้
ช่องตอบกลับข้อผิดพลาด | |
---|---|
error |
สตริงข้อผิดพลาด ต้องระบุ |
error_description |
คำอธิบายข้อผิดพลาดที่มนุษย์อ่านได้ |
error_uri |
URI ที่แสดงรายละเอียดเพิ่มเติมเกี่ยวกับข้อผิดพลาด |
ตัวอย่างการตอบกลับข้อผิดพลาด 400
HTTP/1.1 400 Bad Request
Content-Type: application/json;charset=UTF-8
Cache-Control: no-store
Pragma: no-cache
{
"error": "invalid_request",
"error_description": "Request was missing the 'access_token' parameter."
}
รหัสการให้สิทธิ์ของ Exchange สำหรับโทเค็นรหัส
คุณจะต้องแลกเปลี่ยนรหัสการให้สิทธิ์ที่ได้รับกับโทเค็น Google ID ซึ่งมีข้อมูลเกี่ยวกับบัญชี Google ของผู้ใช้
หากต้องการแลกเปลี่ยนรหัสการให้สิทธิ์สำหรับโทเค็น Google ID ให้เรียกใช้ปลายทาง https://oauth2.googleapis.com/token
และตั้งค่าพารามิเตอร์ต่อไปนี้
ช่องคำขอ | |
---|---|
client_id |
ต้องระบุ รหัสไคลเอ็นต์ที่ได้รับจากหน้าข้อมูลเข้าสู่ระบบของคอนโซล API ซึ่งมักจะเป็นข้อมูลเข้าสู่ระบบที่ชื่อว่าแอป Actions on Google ใหม่ |
client_secret |
ต้องระบุ รหัสลับไคลเอ็นต์ที่ได้จากหน้าข้อมูลเข้าสู่ระบบของคอนโซล API |
code |
ต้องระบุ รหัสการให้สิทธิ์ที่ส่งในคำขอเริ่มต้น |
grant_type |
ต้องระบุ ตามที่ระบุไว้ในข้อกำหนด OAuth 2.0 ค่าในช่องนี้จะต้องตั้งเป็น authorization_code |
ตัวอย่างคำขอ
POST /oauth2/v4/token HTTP/1.1
Host: www.googleapis.com
Content-Type: application/x-www-form-urlencoded
code=GOOGLE_AUTHORIZATION_CODE
&grant_type=authorization_code
&client_id=GOOGLE_CLIENT_ID
&client_secret=GOOGLE_CLIENT_SECRET
Google ตอบกลับคําขอนี้โดยแสดงผลออบเจ็กต์ JSON ที่มีโทเค็นเพื่อการเข้าถึงที่มีอายุสั้นและโทเค็นการรีเฟรช
คำตอบจะมีช่องต่อไปนี้
ช่องคำตอบ | |
---|---|
access_token |
โทเค็นเพื่อการเข้าถึงที่ออกโดย Google ซึ่งแอปพลิเคชันของคุณส่งเพื่อให้สิทธิ์คำขอ Google API |
id_token |
โทเค็นรหัสประกอบด้วยข้อมูลบัญชี Google ของผู้ใช้ ส่วนตรวจสอบการตอบกลับมีรายละเอียดเกี่ยวกับวิธีถอดรหัสและตรวจสอบการตอบกลับโทเค็นรหัส |
expires_in |
อายุการใช้งานที่เหลือของโทเค็นเพื่อการเข้าถึงเป็นวินาที |
refresh_token |
โทเค็นที่คุณใช้เพื่อรับโทเค็นเพื่อการเข้าถึงใหม่ได้ โทเค็นการรีเฟรชจะใช้ได้จนกว่าผู้ใช้จะเพิกถอนสิทธิ์เข้าถึง |
scope |
ค่าของช่องนี้จะตั้งค่าเป็น openid เสมอสำหรับกรณีการใช้งานการลงชื่อเข้าใช้บัญชีที่ลิงก์ |
token_type |
ประเภทของโทเค็นที่แสดงผล ปัจจุบันค่าของช่องนี้จะเป็น Bearer เสมอ |
ตัวอย่างการตอบกลับ
HTTP/1.1 200 OK
Content-type: application/json; charset=utf-8
{
"access_token": "Google-access-token",
"id_token": "Google-ID-token",
"expires_in": 3599,
"token_type": "Bearer",
"scope": "openid",
"refresh_token": "Google-refresh-token"
}
POST /oauth2/v4/token HTTP/1.1
Host: www.googleapis.com
Content-Type: application/x-www-form-urlencoded
code=Google authorization code
&grant_type=authorization_code
&client_id=Google client id
&client_secret=Google client secret
ตรวจสอบการตอบกลับของโทเค็นรหัส
ตรวจสอบและถอดรหัสการยืนยัน 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
) คือรหัสไคลเอ็นต์ที่กําหนด และโทเค็นยังไม่หมดอายุ
(ช่อง exp
)
เมื่อใช้ช่อง email
, email_verified
และ hd
คุณจะระบุได้ว่า
Google โฮสต์และมีสิทธิ์สำหรับอีเมล ในกรณีที่ Google
เชื่อถือได้ ซึ่งผู้ใช้ปัจจุบันเป็นเจ้าของบัญชีที่ถูกต้อง
และคุณก็สามารถข้ามการใช้รหัสผ่านหรือวิธีการพิสูจน์อื่นๆ ได้ มิเช่นนั้น วิธีการเหล่านี้
สามารถใช้ยืนยันบัญชีก่อนลิงก์ได้
กรณีที่ Google เชื่อถือได้
email
มีส่วนต่อท้าย@gmail.com
นี่คือบัญชี Gmailemail_verified
เป็นจริงและตั้งค่าhd
แล้ว นี่คือบัญชี G Suite
ผู้ใช้อาจลงทะเบียนบัญชี Google โดยไม่ใช้ Gmail หรือ G Suite ได้ วันและเวลา
email
ไม่มีคำต่อท้าย @gmail.com
และ hd
ไม่มี Google ไม่มี
แนะนำให้ใช้รหัสผ่านหรือวิธีการอื่นๆ ในการพิสูจน์ยืนยัน
ผู้ใช้รายนั้น email_verified
ก็อาจเป็นจริงได้ เนื่องจาก Google ได้ยืนยัน
ผู้ใช้เมื่อมีการสร้างบัญชี Google แต่การเป็นเจ้าของของบุคคลที่สาม
บัญชีอีเมลของคุณอาจมีการเปลี่ยนแปลง