การลิงก์ที่มีประสิทธิภาพยิ่งขึ้นด้วย OAuth และ Google Sign-In

ภาพรวม

การลิงก์ Google Sign-In ที่ได้รับการตรวจสอบสิทธิ์ผ่าน OAuth จะเพิ่ม Google Sign-In นอกเหนือจากการลิงก์ OAuth ซึ่งทําให้ผู้ใช้ Google ลิงก์ได้อย่างราบรื่นและยังทําให้สร้างบัญชีได้ ซึ่งช่วยให้ผู้ใช้สร้างบัญชีใหม่ในบริการของคุณโดยใช้บัญชี Google

หากต้องการลิงก์บัญชีกับ OAuth และ Google Sign-In ให้ทําตามขั้นตอนทั่วไปต่อไปนี้

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

รูปที่ 1 การลิงก์บัญชีในโทรศัพท์ของผู้ใช้ด้วยการลิงก์ที่มีประสิทธิภาพยิ่งขึ้น

ข้อกําหนดสําหรับการลิงก์ที่มีประสิทธิภาพ

ใช้งานเซิร์ฟเวอร์ OAuth

ปลายทาง token Exchange ต้องรองรับ Intent check, create และ get ด้านล่างนี้จะแสดงขั้นตอนที่ทําผ่านขั้นตอนการลิงก์บัญชี และระบุเวลาที่เรียกใช้ Intent ต่างๆ

  1. ผู้ใช้มีบัญชีในระบบการตรวจสอบสิทธิ์ของคุณหรือไม่ (ผู้ใช้ตัดสินใจโดยเลือก "ใช่" หรือ "ไม่")
    1. ใช่ : ผู้ใช้ได้ใช้อีเมลที่เชื่อมโยงกับบัญชี Google เพื่อลงชื่อเข้าใช้แพลตฟอร์มของคุณหรือไม่ (ผู้ใช้ตัดสินใจโดยเลือก "ใช่" หรือ "ไม่")
      1. ใช่ : ผู้ใช้มีบัญชีที่ตรงกันในระบบการตรวจสอบสิทธิ์ของคุณหรือไม่ (check intent จะถูกเรียกใช้เพื่อยืนยัน)
        1. ใช่ : ระบบจะเรียกใช้ get intent และบัญชีจะลิงก์บัญชีหากรับ Intent คืนสําเร็จ
        2. ไม่ : สร้างบัญชีใหม่ใช่ไหม (ผู้ใช้ตัดสินใจโดยเลือก "ใช่" หรือ "ไม่")
          1. ใช่ : ระบบจะเรียกใช้ create intent และลิงก์บัญชีเมื่อสร้าง Intent สําเร็จ
          2. ไม่ : จะมีการทริกเกอร์ขั้นตอน OAuth เว็บ ระบบจะนําผู้ใช้ไปยังเบราว์เซอร์ของผู้ใช้ และผู้ใช้มีตัวเลือกในการลิงก์กับอีเมลอื่น
      2. ไม่ จะมีการเรียกขั้นตอน OAuth สําหรับเว็บ ซึ่งระบบจะเปลี่ยนเส้นทางให้ผู้ใช้ไปที่เบราว์เซอร์ และผู้ใช้จะมีตัวเลือกให้ลิงก์กับอีเมลอื่นได้
    2. ไม่ : ผู้ใช้มีบัญชีที่ตรงกันในระบบการตรวจสอบสิทธิ์ของคุณหรือไม่ (check intent จะถูกเรียกใช้เพื่อยืนยัน)
      1. ใช่ : ระบบจะเรียกใช้ get intent และบัญชีจะลิงก์บัญชีหากรับ Intent คืนสําเร็จ
      2. ไม่ : ระบบจะเรียกใช้ create intent และระบบจะลิงก์บัญชีหากสร้าง Intent สําเร็จ

ตรวจหาบัญชีผู้ใช้ที่มีอยู่ (ตรวจสอบความตั้งใจ)

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

หากมีบัญชี Google ที่เกี่ยวข้องอยู่ในระบบการตรวจสอบสิทธิ์แล้ว ปลายทางการแลกเปลี่ยนโทเค็นจะตอบกลับด้วย account_found=true หากบัญชี Google ไม่ตรงกับผู้ใช้ที่มีอยู่ ปลายทางการแลกเปลี่ยนโทเค็นจะแสดงข้อผิดพลาด HTTP 404 Not Found ด้วย account_found=false

คําขอจะมีรูปแบบต่อไปนี้

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 (JWT) ที่ยืนยันตัวตนผู้ใช้ของ Google พร้อมลงนาม JWT มีข้อมูลที่รวมรหัสบัญชี Google, ชื่อ และอีเมลของ Google
client_id รหัสไคลเอ็นต์ที่คุณกําหนดให้ Google
client_secret รหัสลับไคลเอ็นต์ที่คุณกําหนดให้ Google

ในการตอบสนองต่อคําขอ Intent ของ check ปลายทางของการแลกเปลี่ยนโทเค็นของคุณจะต้องทําตามขั้นตอนต่อไปนี้

  • ตรวจสอบและถอดรหัสการยืนยัน 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 ฟิลด์) เป็นรหัสลูกค้าที่ได้รับมอบหมายของคุณและที่โทเค็นยังไม่หมดอายุ ( 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 อย่างไรก็ตามความเป็นเจ้าของบัญชีอีเมลของบุคคลที่สามอาจมีการเปลี่ยนแปลง

ตรวจสอบว่ามีบัญชี Google อยู่ในระบบการตรวจสอบสิทธิ์แล้วหรือไม่

ตรวจสอบว่าเงื่อนไขข้อใดข้อหนึ่งต่อไปนี้เป็นจริงหรือไม่

  • รหัสบัญชี Google ที่พบในช่อง sub การยืนยันอยู่ในฐานข้อมูลผู้ใช้ของคุณ
  • อีเมลในโปรแกรมยืนยันตรงกับผู้ใช้ในฐานข้อมูลผู้ใช้

หากเงื่อนไขข้อใดข้อหนึ่งเป็นจริง แสดงว่าผู้ใช้ลงชื่อสมัครใช้แล้ว ในกรณีดังกล่าว ให้ตอบกลับดังนี้

HTTP/1.1 200 Success
Content-Type: application/json;charset=UTF-8

{
  "account_found":"true",
}

หากรหัสบัญชี Google และอีเมลที่ระบุในการยืนยันไม่ตรงกับผู้ใช้ในฐานข้อมูลของคุณ ผู้ใช้ก็ยังไม่ได้ลงชื่อสมัครใช้ ในกรณีนี้ ปลายทางของการแลกเปลี่ยนโทเค็นของคุณต้องตอบกลับด้วยข้อผิดพลาด HTTP 404 ที่ระบุ "account_found": "false" ดังตัวอย่างต่อไปนี้

HTTP/1.1 404 Not found
Content-Type: application/json;charset=UTF-8

{
  "account_found":"false",
}

จัดการกับการลิงก์อัตโนมัติ (รับความตั้งใจ)

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

หากมีบัญชี Google ที่เกี่ยวข้องอยู่ในระบบการตรวจสอบสิทธิ์แล้ว ปลายทางการแลกเปลี่ยนโทเค็นจะแสดงผลโทเค็นให้ผู้ใช้ หากบัญชี Google ไม่ตรงกับผู้ใช้ที่มีอยู่ ปลายทางการแลกเปลี่ยนโทเค็นจะแสดงข้อผิดพลาด linking_error และไม่บังคับ login_hint

คําขอจะมีรูปแบบต่อไปนี้

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

ปลายทางของการแลกเปลี่ยนโทเค็นของคุณต้องสามารถจัดการพารามิเตอร์ต่อไปนี้

พารามิเตอร์ปลายทางของโทเค็น
intent สําหรับคําขอเหล่านี้ ค่าของพารามิเตอร์นี้คือ get
grant_type ประเภทของโทเค็นที่แลกเปลี่ยน สําหรับคําขอเหล่านี้ พารามิเตอร์นี้มีค่า urn:ietf:params:oauth:grant-type:jwt-bearer
assertion โทเค็นเว็บ JSON (JWT) ที่ยืนยันตัวตนผู้ใช้ของ Google พร้อมลงนาม JWT มีข้อมูลที่รวมรหัสบัญชี Google, ชื่อ และอีเมลของ Google
scope ไม่บังคับ: ขอบเขตทั้งหมดที่คุณกําหนดค่าให้ Google ขอจากผู้ใช้
client_id รหัสไคลเอ็นต์ที่คุณกําหนดให้ Google
client_secret รหัสลับไคลเอ็นต์ที่คุณกําหนดให้ Google

ในการตอบสนองต่อคําขอ Intent ของ get ปลายทางของการแลกเปลี่ยนโทเค็นของคุณจะต้องทําตามขั้นตอนต่อไปนี้

  • ตรวจสอบและถอดรหัสการยืนยัน 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 ฟิลด์) เป็นรหัสลูกค้าที่ได้รับมอบหมายของคุณและที่โทเค็นยังไม่หมดอายุ ( 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 อย่างไรก็ตามความเป็นเจ้าของบัญชีอีเมลของบุคคลที่สามอาจมีการเปลี่ยนแปลง

ตรวจสอบว่ามีบัญชี Google อยู่ในระบบการตรวจสอบสิทธิ์แล้วหรือไม่

ตรวจสอบว่าเงื่อนไขข้อใดข้อหนึ่งต่อไปนี้เป็นจริงหรือไม่

  • รหัสบัญชี Google ที่พบในช่อง sub การยืนยันอยู่ในฐานข้อมูลผู้ใช้ของคุณ
  • อีเมลในโปรแกรมยืนยันตรงกับผู้ใช้ในฐานข้อมูลผู้ใช้

หากพบบัญชีของผู้ใช้ ให้ออกโทเค็นเพื่อการเข้าถึงแล้วแสดงผลค่าในออบเจ็กต์ JSON ในส่วนเนื้อหาของการตอบกลับ HTTPS ดังตัวอย่างต่อไปนี้

{
  "token_type": "Bearer",
  "access_token": "ACCESS_TOKEN",

  "refresh_token": "REFRESH_TOKEN",

  "expires_in": SECONDS_TO_EXPIRATION
}

ในบางกรณี การลิงก์บัญชีตามโทเค็นรหัสอาจล้มเหลวสําหรับผู้ใช้ หากเป็นเช่นนั้น ปลายทางของการแลกเปลี่ยนโทเค็นของคุณจะต้องตอบกลับโดยมีข้อผิดพลาด HTTP 401 ซึ่งระบุ error=linking_error ตามตัวอย่างต่อไปนี้

HTTP/1.1 401 Unauthorized
Content-Type: application/json;charset=UTF-8

{
  "error":"linking_error",
  "login_hint":"foo@bar.com"
}

เมื่อ Google ได้รับการตอบกลับข้อผิดพลาด 401 กับ linking_error Google จะส่งผู้ใช้ไปยังปลายทางการให้สิทธิ์ที่มี login_hint เป็นพารามิเตอร์ ผู้ใช้ลิงก์บัญชีให้เสร็จสมบูรณ์โดยใช้ขั้นตอนการลิงก์ OAuth ในเบราว์เซอร์

จัดการการสร้างบัญชีผ่าน Google Sign-In (สร้างความตั้งใจ)

เมื่อผู้ใช้ต้องสร้างบัญชีในบริการของคุณ 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 (JWT) ที่ยืนยันตัวตนผู้ใช้ของ Google พร้อมลงนาม JWT มีข้อมูลที่รวมรหัสบัญชี Google, ชื่อ และอีเมลของ Google
client_id รหัสไคลเอ็นต์ที่คุณกําหนดให้ Google
client_secret รหัสลับไคลเอ็นต์ที่คุณกําหนดให้ Google

JWT ภายในพารามิเตอร์ assertion มีรหัสบัญชี Google, ชื่อ และอีเมลของ Google ซึ่งคุณสามารถใช้ในการสร้างบัญชีใหม่ในบริการของคุณ

ในการตอบสนองต่อคําขอ Intent ของ create ปลายทางของการแลกเปลี่ยนโทเค็นของคุณจะต้องทําตามขั้นตอนต่อไปนี้

  • ตรวจสอบและถอดรหัสการยืนยัน 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 ฟิลด์) เป็นรหัสลูกค้าที่ได้รับมอบหมายของคุณและที่โทเค็นยังไม่หมดอายุ ( 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 อย่างไรก็ตามความเป็นเจ้าของบัญชีอีเมลของบุคคลที่สามอาจมีการเปลี่ยนแปลง

ตรวจสอบข้อมูลผู้ใช้และสร้างบัญชีใหม่

ตรวจสอบว่าเงื่อนไขข้อใดข้อหนึ่งต่อไปนี้เป็นจริงหรือไม่

  • รหัสบัญชี Google ที่พบในช่อง sub การยืนยันอยู่ในฐานข้อมูลผู้ใช้ของคุณ
  • อีเมลในโปรแกรมยืนยันตรงกับผู้ใช้ในฐานข้อมูลผู้ใช้

หากเงื่อนไขข้อใดข้อหนึ่งเป็นจริง ให้แจ้งให้ผู้ใช้ลิงก์บัญชีที่มีอยู่กับบัญชี Google โดยตอบกลับคําขอที่มีข้อผิดพลาด HTTP 401 ซึ่งระบุ error=linking_error และให้อีเมลของผู้ใช้เป็น login_hint ตัวอย่างคําตอบมีดังนี้

HTTP/1.1 401 Unauthorized
Content-Type: application/json;charset=UTF-8

{
  "error":"linking_error",
  "login_hint":"foo@bar.com"
}

เมื่อ Google ได้รับการตอบกลับข้อผิดพลาด 401 กับ linking_error Google จะส่งผู้ใช้ไปยังปลายทางการให้สิทธิ์ที่มี login_hint เป็นพารามิเตอร์ ผู้ใช้ลิงก์บัญชีให้เสร็จสมบูรณ์โดยใช้ขั้นตอนการลิงก์ OAuth ในเบราว์เซอร์

หากเงื่อนไขไม่เป็นจริง ให้สร้างบัญชีผู้ใช้ใหม่ด้วยข้อมูลที่ให้ไว้ใน JWT โดยปกติบัญชีใหม่ๆ จะไม่มีการตั้งค่ารหัสผ่าน ขอแนะนําให้คุณเพิ่ม Google Sign-In ไปยังแพลตฟอร์มอื่นๆ เพื่อให้ผู้ใช้ลงชื่อเข้าสู่ระบบด้วย Google ในแพลตฟอร์มต่างๆ ของแอปพลิเคชันได้ หรือคุณจะส่งอีเมลลิงก์ไปยังผู้ใช้ที่เริ่มขั้นตอนการกู้คืนรหัสผ่านแก่ผู้ใช้ก็ได้ เพื่อให้ผู้ใช้ตั้งรหัสผ่านเพื่อลงชื่อเข้าใช้ในแพลตฟอร์มอื่นๆ ได้

เมื่อสร้างเสร็จแล้ว คุณต้องออกโทเค็นเพื่อการเข้าถึง และรีเฟรชโทเค็น แล้วแสดงผลค่าในออบเจ็กต์ JSON ในส่วนเนื้อหาของการตอบกลับ HTTPS ดังตัวอย่างต่อไปนี้

{
  "token_type": "Bearer",
  "access_token": "ACCESS_TOKEN",

  "refresh_token": "REFRESH_TOKEN",

  "expires_in": SECONDS_TO_EXPIRATION
}

รับรหัสไคลเอ็นต์ Google API

คุณจะต้องระบุรหัสไคลเอ็นต์ Google API ในระหว่างขั้นตอนการลงทะเบียนการลิงก์บัญชี

วิธีรับรหัสไคลเอ็นต์ API โดยใช้โปรเจ็กต์ที่คุณสร้างขณะทําตามขั้นตอนการลิงก์ OAuth โดยทําตามขั้นตอนต่อไปนี้

  1. เปิดหน้าข้อมูลเข้าสู่ระบบของคอนโซล Google API
  2. สร้างหรือเลือกโปรเจ็กต์ Google APIs

    หากโปรเจ็กต์ไม่มีรหัสไคลเอ็นต์สําหรับประเภทเว็บแอปพลิเคชัน ให้คลิกสร้างข้อมูลรับรอง &gt รหัสไคลเอ็นต์ OAuth เพื่อสร้าง อย่าลืมใส่โดเมนของเว็บไซต์ในช่องต้นทาง JavaScript ที่ได้รับอนุญาต เมื่อทําการทดสอบหรือพัฒนาในเครื่อง คุณต้องเพิ่มทั้ง http://localhost และ http://localhost:<port_number> ลงในช่อง Origin JavaScript ที่ได้รับอนุญาต

การตรวจสอบการติดตั้งใช้งาน

คุณสามารถตรวจสอบการดำเนินงานของคุณโดยใช้ OAuth 2.0 สนามเด็กเล่น เครื่องมือ

ในเครื่องมือ ให้ทำตามขั้นตอนต่อไปนี้:

  1. คลิกการกำหนดค่า เพื่อเปิดหน้าต่าง OAuth 2.0 การกำหนดค่า
  2. ในด้านการไหล OAuth เลือกฝั่งไคลเอ็นต์
  3. ในฟิลด์ OAuth ปลายทางเลือกที่กำหนดเอง
  4. ระบุตำแหน่งข้อมูล OAuth 2.0 และรหัสไคลเอ็นต์ที่คุณกำหนดให้กับ Google ในช่องที่เกี่ยวข้อง
  5. ในขั้นตอนที่ 1 ส่วนที่ไม่ได้เลือกขอบเขตใด ๆ ของ Google ให้ปล่อยฟิลด์นี้ว่างไว้หรือพิมพ์ขอบเขตที่ถูกต้องสำหรับเซิร์ฟเวอร์ของคุณ (หรือสตริงที่กำหนดเองหากคุณไม่ได้ใช้ขอบเขต OAuth) เมื่อคุณทำเสร็จแล้วคลิกอนุญาต APIs
  6. ในขั้นตอนที่ 2 และขั้นตอนที่ 3 ส่วนไปไหลผ่าน OAuth 2.0 และตรวจสอบว่าแต่ละขั้นตอนการทำงานตามที่ตั้งใจไว้

คุณสามารถตรวจสอบการดำเนินงานของคุณโดยใช้ บัญชี Google เชื่อมโยงการสาธิต เครื่องมือ

ในเครื่องมือ ให้ทำตามขั้นตอนต่อไปนี้:

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