การลงชื่อเข้าใช้บัญชีที่ลิงก์

การลิงก์บัญชี Google ช่วยให้เจ้าของบัญชี Google เชื่อมต่อกับบริการและแชร์ข้อมูลกับ Google ได้อย่างรวดเร็วและปลอดภัย

การลงชื่อเข้าใช้บัญชีที่ลิงก์จะเปิดใช้การลงชื่อเข้าใช้ด้วย One Tap ด้วย Google สำหรับผู้ใช้ที่ลิงก์บัญชี Google ของตนกับบริการของคุณอยู่แล้ว ซึ่งจะช่วยปรับปรุงประสบการณ์ของผู้ใช้เพราะสามารถลงชื่อเข้าใช้ได้ในคลิกเดียว โดยไม่ต้องป้อนชื่อผู้ใช้และรหัสผ่านอีกครั้ง และยังลดโอกาสที่ผู้ใช้จะสร้างบัญชีซ้ำในบริการของคุณอีกด้วย

ข้อกำหนด

คุณต้องปฏิบัติตามข้อกำหนดต่อไปนี้จึงจะใช้การลงชื่อเข้าใช้บัญชีที่ลิงก์ได้

  • คุณมีการใช้งานการลิงก์ OAuth สำหรับบัญชี Google ที่รองรับขั้นตอนรหัสการให้สิทธิ์ OAuth 2.0 การใช้งาน OAuth ต้องมีปลายทางต่อไปนี้
    • ปลายทางการให้สิทธิ์เพื่อจัดการคำขอการให้สิทธิ์
    • โทเค็นปลายทางเพื่อจัดการคำขอเข้าถึงและรีเฟรชโทเค็น
    • userinfo destination เพื่อดึงข้อมูลบัญชีพื้นฐานเกี่ยวกับผู้ใช้ที่ลิงก์ซึ่งแสดงต่อผู้ใช้ในกระบวนการลงชื่อเข้าใช้บัญชีที่ลิงก์
  • คุณมีแอป Android

วิธีการทำงาน

สิ่งที่ต้องทำก่อน : ผู้ใช้ได้เชื่อมโยงบัญชี Google กับบัญชีของตนในบริการของคุณก่อนหน้านี้

  1. คุณเลือกที่จะแสดงบัญชีที่ลิงก์ระหว่างขั้นตอนการลงชื่อเข้าใช้ด้วย One Tap
  2. ผู้ใช้จะเห็นข้อความแจ้งให้ลงชื่อเข้าใช้ด้วย One Tap พร้อมตัวเลือกในการลงชื่อเข้าใช้บริการด้วยบัญชีที่ลิงก์ไว้
  3. หากผู้ใช้เลือกที่จะดำเนินการต่อด้วยบัญชีที่ลิงก์ Google จะส่งคำขอไปยังปลายทางของโทเค็นของคุณเพื่อบันทึกรหัสการให้สิทธิ์ คําขอมีโทเค็นเพื่อการเข้าถึงของผู้ใช้ซึ่งออกโดยบริการของคุณและรหัสการให้สิทธิ์ของ Google
  4. คุณแลกเปลี่ยนรหัสการให้สิทธิ์ของ Google เป็นโทเค็นรหัส Google ที่มีข้อมูลเกี่ยวกับบัญชี Google ของผู้ใช้
  5. แอปของคุณจะยังได้รับโทเค็นรหัสเมื่อขั้นตอนเสร็จสิ้น และคุณจับคู่โทเค็นนี้กับตัวระบุผู้ใช้ในโทเค็นรหัสที่เซิร์ฟเวอร์ได้รับเพื่อลงชื่อเข้าใช้ให้ผู้ใช้ในแอปของคุณ
การลงชื่อเข้าใช้บัญชีที่ลิงก์
รูปที่ 1 ขั้นตอนการลงชื่อเข้าใช้บัญชีที่ลิงก์ หากผู้ใช้มีบัญชีที่ลงชื่อเข้าใช้หลายบัญชีในอุปกรณ์ ผู้ใช้อาจเห็นตัวเลือกบัญชีและระบบจะนําไปยังมุมมองการลงชื่อเข้าใช้บัญชีที่ลิงก์ก็ต่อเมื่อผู้ใช้เลือกบัญชีที่ลิงก์เท่านั้น

ใช้การลงชื่อเข้าใช้บัญชีที่ลิงก์ในแอป Android ของคุณ

หากต้องการรองรับการลงชื่อเข้าใช้บัญชีที่ลิงก์ในแอป Android โปรดทำตามวิธีการในคู่มือการติดตั้งใช้งาน Android

จัดการคำขอรหัสการให้สิทธิ์จาก Google

Google จะส่งคำขอ POST ไปยังปลายทางของโทเค็นของคุณเพื่อบันทึกรหัสการให้สิทธิ์ที่คุณแลกเปลี่ยนกับโทเค็นรหัสของผู้ใช้ คําขอมีโทเค็นเพื่อการเข้าถึงของผู้ใช้และรหัสการให้สิทธิ์ OAuth2 ที่ออกให้

ก่อนที่จะบันทึกรหัสการให้สิทธิ์ คุณต้องยืนยันโทเค็นเพื่อการเข้าถึงที่คุณให้กับ 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 โดยทำตามขั้นตอนต่อไปนี้

  • ยืนยันว่าclient_idได้มอบ access_token ให้แก่ Google แล้ว
  • ตอบกลับด้วยการตอบกลับ 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 ซึ่งมีข้อมูลเกี่ยวกับบัญชี Google ของผู้ใช้

หากต้องการแลกเปลี่ยนรหัสการให้สิทธิ์กับโทเค็นรหัส Google ให้เรียกใช้ปลายทาง 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

ตรวจสอบการตอบกลับโทเค็น ID

ตรวจสอบและถอดรหัสการยืนยัน 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 นี่คือบัญชี Gmail
  • email_verified เป็นจริงและตั้งค่า hd แล้วนี่คือบัญชี G Suite

ผู้ใช้สามารถลงทะเบียนบัญชี Google ได้โดยไม่ต้องใช้ Gmail หรือ G Suite เมื่อ email ไม่มีคำต่อท้าย @gmail.com และ hd ไม่มี Google ไม่ได้รับอนุญาตและขอแนะนำให้ใช้รหัสผ่านหรือวิธีการท้าทายอื่น ๆ ในการยืนยันผู้ใช้ email_verfied อาจเป็นจริงได้เช่นกันเนื่องจาก Google ได้ยืนยันผู้ใช้ในตอนแรกเมื่อสร้างบัญชี Google อย่างไรก็ตามความเป็นเจ้าของบัญชีอีเมลของบุคคลที่สามอาจมีการเปลี่ยนแปลง