การให้สิทธิ์ Google OAuth 2 - ข้อผิดพลาด: redirect_uri_mismatch


386

บนเว็บไซต์https://code.google.com/apis/consoleฉันได้ลงทะเบียนแอปพลิเคชันของฉันแล้วตั้งค่ารหัสลูกค้าที่สร้าง:และความลับลูกค้าในแอปของฉันและพยายามลงชื่อเข้าใช้ด้วย Google น่าเสียดายที่ฉันได้รับข้อความแสดงข้อผิดพลาด:

Error: redirect_uri_mismatch
The redirect URI in the request: http://127.0.0.1:3000/auth/google_oauth2/callback did not match a registered redirect URI

scope=https://www.googleapis.com/auth/userinfo.profile https://www.googleapis.com/auth/userinfo.email
response_type=code
redirect_uri=http://127.0.0.1:3000/auth/google_oauth2/callback
access_type=offline
approval_prompt=force
client_id=generated_id

ข้อความนี้หมายถึงอะไรและฉันจะแก้ไขได้อย่างไร ผมใช้อัญมณีomniauth-google-OAuth2


สำหรับใครก็ตามที่มีปัญหานี้โปรดทราบว่าคุณสามารถแก้ไขปัญหานี้ได้โดยเข้าถึง URL เช่นhttps://accounts.google.com/o/oauth2/auth?client_id={client_id}&response_type=token&redirect_uri={redirect_uri}&scope={scope}ในเบราว์เซอร์แทนที่จะเรียกใช้แอปทั้งหมดของคุณเพื่อทดสอบ
Jack M

ฉันได้สังเกตเห็นว่า Google ผูกมัด redirect_uri โดยอัตโนมัติในเครื่องหมายคำพูดคู่ใน (redirect_uri = "อะไรก็ตาม") เหนือ url และทำให้เกิดข้อผิดพลาดนี้ หากฉันลบเครื่องหมายคำพูดคู่นี้ฉันสามารถผ่านหน้าจอถัดไปได้ ตอนนี้เราจะหลีกเลี่ยงคำพูดสองคำนี้ได้อย่างไรเพราะมันถูกเปลี่ยนเส้นทางโดย google เอง
Abhishek Soni

คำตอบ:


388

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

ไปที่คอนโซลสำหรับโครงการของคุณและดูภายใต้การเข้าถึง API คุณควรเห็นclient ID& ที่client secretนั่นพร้อมกับรายการของการเปลี่ยนเส้นทาง URIs หาก URI ที่คุณต้องการไม่มีอยู่ในรายการให้คลิกแก้ไขการตั้งค่าและเพิ่ม URI ลงในรายการ

แก้ไข: (จากความคิดเห็นที่ได้คะแนนสูงด้านล่าง) โปรดทราบว่าการอัปเดตคอนโซลของ Google api และการเปลี่ยนแปลงที่มีอยู่อาจใช้เวลาสักครู่ โดยทั่วไปแล้วเพียงไม่กี่นาที แต่บางครั้งก็ดูเหมือนนานกว่านั้น


9
มีเวทมนต์บางอย่างเพราะเมื่อฉันลองโทรกลับที่เหมือนกันเมื่อชั่วโมงก่อนมันไม่ทำงาน แต่ตอนนี้มันใช้งานได้แล้ว อย่างไรก็ตามขอบคุณ!
user984621

337
พบปัญหาที่คล้ายกันและต้องการทราบว่าการอัปเดตคอนโซลของ Google api และการเปลี่ยนแปลงที่เกิดขึ้นอาจใช้เวลาพอสมควร โดยทั่วไปแล้วเพียงไม่กี่นาที แต่บางครั้งก็ดูเหมือนนานกว่านั้น
sdolphin

31
ให้ฉันทำคำตอบของ @ Bazyl ให้สมบูรณ์: ในข้อความที่ฉันได้รับพวกเขาพูดถึง URI " localhost: 8080 " (ซึ่งแน่นอนว่าดูเหมือนว่าเป็นการกำหนดค่า google ภายใน) ฉันเปลี่ยน URI ที่ได้รับอนุญาตสำหรับ " localhost: 8080 " และข้อความไม่ปรากฏอีกต่อไป ... และวิดีโอที่อัปโหลด ... เอกสาร APIS นั้นอ่อนแอมาก ... ทุกครั้งที่ฉันทำงานอะไร google apis ฉันแค่รู้สึก "โชคดี" แต่ไม่มีเอกสารที่ดีเกี่ยวกับเรื่องนี้ .... :(
David L

7
เปิดหน้าต่างส่วนตัว / ไม่ระบุตัวตนในเบราว์เซอร์ของคุณแล้วลองอีกครั้ง บางครั้งสิ่งนี้จะช่วยแก้ไขปัญหาการแคช
Dunc

17
google ไม่มีตัวเลือกสำหรับการเปลี่ยนเส้นทาง uri ในคอนโซลของ Google ใน "Api & Auth> ข้อมูลรับรอง" ไม่สำคัญว่าฉันจะสร้างรหัสลูกค้าใหม่หรือสร้างรหัสใหม่ไม่มีวิธีที่จะระบุ uri การเปลี่ยนเส้นทางจาก คอนโซล google
user3338098

114

ในกรณีของฉันมันเป็นwwwและnon-wwwURL ไซต์จริงมีwwwURL และURIs การเปลี่ยนเส้นทางที่ได้รับอนุญาตในคอนโซลนักพัฒนาซอฟต์แวร์ของ Google มีnon-wwwURL ดังนั้นจึงมีความไม่ตรงกันในการเปลี่ยนเส้นทาง URI ฉันแก้ไขได้โดยอัปเดตAuthorized Redirect URIsใน Google Developer Console เป็นwwwURL

ข้อผิดพลาด URI ทั่วไปอื่น ๆ คือ:

  • ใช้http://ใน URIs การเปลี่ยนเส้นทางที่ได้รับอนุญาตและhttps://เป็น URL จริงหรือในทางกลับกัน
  • การใช้การต่อท้ายสแลช ( http://example.com/) ใน URIs การเปลี่ยนเส้นทางที่ได้รับอนุญาตและไม่ใช้การต่อท้ายสแลช ( http://example.com) เป็น URL จริงหรือในทางกลับกัน

นี่คือภาพหน้าจอทีละขั้นตอนของคอนโซลนักพัฒนาซอฟต์แวร์ของ Google เพื่อให้เป็นประโยชน์สำหรับผู้ที่ยากที่จะค้นหาหน้าคอนโซลนักพัฒนาซอฟต์แวร์เพื่ออัปเดต URIs การเปลี่ยนเส้นทาง

  1. ไปที่https://console.developers.google.com

  2. เลือกโครงการของคุณ

เลือกโครงการของคุณ

  1. คลิกที่ไอคอนเมนู

คลิกที่ไอคอนเมนู

  1. คลิกที่API Managerเมนู

เลือกเมนู API Manager

  1. คลิกที่Credentialsเมนู และภายใต้OAuth 2.0 Client IDsคุณจะพบชื่อลูกค้าของคุณ Web Client 1ในกรณีของฉันมันเป็น คลิกที่ภาพและป๊อปอัพจะปรากฏขึ้นซึ่งคุณสามารถแก้ไขผู้มีอำนาจ Javascript แหล่งกำเนิดสินค้าและยูริเปลี่ยนเส้นทางที่ได้รับอนุญาต

เลือกเมนูข้อมูลรับรอง

นี่คือบทความของ Google ในการสร้างโครงการและรหัสลูกค้า


9
คำตอบนี้จะต้องมีการผลักดันที่สูงขึ้นจริงๆเพราะมันให้คำตอบที่แท้จริง เรามีปัญหาเดียวกันที่แน่นอนและสิ่งนี้ช่วยแก้ไขได้ - ขอบคุณ!
winna

4
ปัญหาของฉันคือฉันรู้ว่าต้องทำอะไร แต่ไม่สามารถหาได้จากภายใน UI ภาพหน้าจอที่นี่ช่วย ขอบคุณ
อัลเลน

3
ฉันทำให้ต้นกำเนิด JavaScript ที่ได้รับอนุญาตว่างเปล่าและ URIs การเปลี่ยนเส้นทางที่ได้รับอนุญาตเป็น127.0.0.1/google_account/ รับรองความถูกต้องและทำงานได้จากฉัน
ฤษณะ

1
คุณช่วยฉันด้วยคำถามของฉันได้ไหม stackoverflow.com/questions/37307612/…
LatentDenis

ช่วยฉันด้วย. stackoverflow.com/questions/41270512/…
Unbreakable

91

หากคุณใช้ปุ่มจาวาสคริปต์ Google+คุณต้องใช้postmessageแทน URI จริง ฉันใช้เวลาเกือบทั้งวันในการคิดสิ่งนี้เนื่องจากเอกสารของ Google ไม่ได้ระบุอย่างชัดเจนด้วยเหตุผลบางประการ


8
เนื่องจากคำถามนี้เป็นคำถามยอดนิยมเมื่อ googling ข้อความแสดงข้อผิดพลาดต่อไปนี้เป็นคำแนะนำเพิ่มเติม อย่างที่ Mike พูดให้ใช้ "postmessage" เพื่อเปลี่ยนเส้นทาง URI ของคุณ คุณต้องระบุใน 2 แห่ง (หากคุณใช้ web-app-server-flow) หนึ่งอยู่ในปุ่ม g-signin บน javascript อีกอันอยู่ในไคลเอนต์การอนุญาตตราในรหัสเซิร์ฟเวอร์ของคุณ
Rob Whiteside

คำตอบที่ดี ฉันกำลังโพสต์ด้วย javascript และจำเป็นต้องตั้ง 'oauth2_redirect_uri' => 'postmessage' ในไฟล์ google API config.php
user2998553

4
postmessage ฟังดูดี แต่มันส่งผลให้ไร้ประโยชน์Error: invalid_request origin parameter is required!
user3338098

10
หลังจากใช้เวลาสองสามชั่วโมงเพื่อพยายามแก้ปัญหานี้คำตอบของคุณช่วยฉันได้มาก! เอกสารของ Google ไม่ชัดเจนมาก ในฝั่งเซิร์ฟเวอร์ถ้าคุณใช้ไลบรารีไคลเอนต์ Google API คุณควรใช้รหัสนี้: $client->setRedirectUri('postmessage');แทน$client->setRedirectUri('http://your.url...');
Guicara

3
ว้าว .... @Guicara ทางออกสำหรับฉันหลังจากชั่วโมงของการตีหัวของฉันกับผนัง
djthoms

52

ในโฟลว์ใด ๆ ที่คุณดึงรหัสการอนุญาตทางฝั่งไคลเอ็นต์เช่นGoogleAuth.grantOfflineAccess()APIและตอนนี้คุณต้องการส่งรหัสไปยังเซิร์ฟเวอร์ของคุณแลกมันและเก็บโทเค็นการเข้าถึงและรีเฟรชแล้วคุณต้องใช้สตริงตัวอักษรpostmessageแทนการเปลี่ยนเส้นทาง

ตัวอย่างเช่นการสร้างข้อมูลโค้ดในRuby doc :

client_secrets = Google::APIClient::ClientSecrets.load('client_secrets.json')
auth_client = client_secrets.to_authorization
auth_client.update!(
  :scope => 'profile https://www.googleapis.com/auth/drive.metadata.readonly',
  :redirect_uri => 'postmessage' # <---- HERE
)

# Inject user's auth_code here:
auth_client.code = "4/lRCuOXzLMIzqrG4XU9RmWw8k1n3jvUgsI790Hk1s3FI"
tokens = auth_client.fetch_access_token!
# { "access_token"=>..., "expires_in"=>3587, "id_token"=>..., "refresh_token"=>..., "token_type"=>"Bearer"}

เพียง Google เอกสารที่จะได้กล่าวถึงpostmessageนี้คือGoogle+ Sign-In เอกสารเก่า นี่คือภาพหน้าจอและลิงก์เก็บถาวรตั้งแต่ G + ปิดและลิงก์นี้จะหายไป:

Legacy Google+ API DOC

ไม่อาจยกโทษให้ได้อย่างแน่นอนว่าหน้าเอกสารสำหรับการเข้าถึงออฟไลน์ไม่ได้กล่าวถึงสิ่งนี้ #FacePalm


1
พระเจ้าเจ้าแช่งโพสต์ของคุณดูไร้เหตุผลทั้งหมด แต่มันเป็นสิ่งเดียวที่ทำงานเหมือนมีเสน่ห์ ขอบคุณมากเพื่อน !!!
mariobgr

@mariobgr ใช่คำตอบอื่น ๆ ที่นี่พูดถึงpostmessageแต่ฉันต้องการที่จะให้สถานการณ์ที่เฉพาะเจาะจง (เช่นgrantOfflineAccess) เมื่อแฮ็คที่ไม่มีเอกสารบ้านี้เป็นสิ่งจำเป็นสำหรับฉัน : PI ไม่ต้องการให้เป็นจริงเช่นกัน :) ทำให้ฉันปวดหัวเป็นเวลาหลายชั่วโมง
เจฟฟ์วอร์ด

ขอบคุณ! นี่คือสิ่งที่ฉันต้องการ
ernbrn

สิ่งนี้ต้องได้รับความสนใจจาก Google นี่มันช่างน่ากลัวจริงๆ
Glade

เหลือเชื่อ แต่จริง ... o__O
เอ็ม

41

สำหรับเว็บแอปพลิเคชันของฉันฉันแก้ไขข้อผิดพลาดด้วยการเขียน

instead of : http://localhost:11472/authorize/
type :      http://localhost/authorize/

ขอบคุณสำหรับการแบ่งปันมันช่วยได้ ฉันติดอยู่กับสิ่งนี้เพราะ GitHub OAuth2 API ไม่ต้องการให้คุณลบหมายเลขพอร์ต
florisla

ที่ทำงานให้ฉันด้วย ฉันกำลังติดตามหลักสูตรนี้: asp.net/mvc/overview/security/และได้รับ 'การเปลี่ยนเส้นทางข้อผิดพลาด uri' หลังจากที่ฉันเปลี่ยนlocalhost: 44334 / signin-googleเป็นlocalhost / signin-googleก็ใช้ได้ ขอบคุณมากสำหรับเคล็ดลับที่มีประโยชน์
FrenkyB

1
ขอบคุณมาก. ฉันกำลังทดสอบกับgithub.com/google/google-api-dotnet-client-samplesนี้และ "URI การเปลี่ยนเส้นทางในคำขอ" ปรากฏว่ามาจากพอร์ตอื่นทุกครั้งที่ฉันวิ่ง สิ่งนี้ช่วยฉันได้มาก ใช้เวลาหลายชั่วโมงกว่าจะเข้าใจว่าเกิดอะไรขึ้น!
Alejandro Lozdziejski

ขอบคุณมันใช้ได้กับฉันด้วย เพียงแค่วางพอร์ต! :)
vidstige

30

ตรวจสอบให้แน่ใจว่าได้ตรวจสอบโปรโตคอล "http: //" หรือ "https: //" เป็น google ตรวจสอบโปรโตคอลด้วย ดีกว่าที่จะเพิ่มทั้งสอง URL ในรายการ


10
ฉันหวังว่าฉันจะเลื่อนคำตอบของคุณสองชั่วโมงก่อนหน้านี้
BiAiB

2
ไม่ดีกว่าเพื่อให้แน่ใจว่าคุณใช้ https
แบรดโคช์

7

ดูเหมือนว่าค่อนข้างแปลกและน่ารำคาญที่ไม่มีวิธีแก้ปัญหาแบบ "หนึ่งเดียว" อยู่ที่นั่น สำหรับฉันhttp: // localhost: 8000ไม่ได้ผล แต่http: // localhost: 8000 /ใช้ได้


2
นี่เป็นเพราะredirect_uriต้องตรงกับ EXACT MATCH บนคอนโซลนักพัฒนาซอฟต์แวร์และในแอปพลิเคชันของคุณ
tony gil

6

เมื่อคุณลงทะเบียนแอปของคุณที่https://code.google.com/apis/consoleและสร้างรหัสลูกค้าคุณจะได้รับโอกาสในการระบุ URIs การเปลี่ยนเส้นทางอย่างน้อยหนึ่งรายการ ค่าของredirect_uriพารามิเตอร์ในรับรองความถูกต้อง URI ของคุณจะต้องตรงกับหนึ่งในนั้น ๆ


และมันขึ้นอยู่กับข้อมูลมากที่มีปัญหาในการเชื่อมโยงลึกตามเชิงมุมกับ google ไม่เห็นด้วย [ landed1.github.io/videos.html#/oauth2callback]is URL ที่ถูกต้อง
ที่ดิน

2
ดูเหมือนว่า URL https://code.google.com/apis/consoleจะไม่ถูกต้องอีกต่อไป
Anthony Kong

ขอบคุณ @AnthonyKong สำหรับการอัปเดตของคุณ ฉันเปลี่ยน URL เพื่อใช้ชีวิต กรุณาตรวจสอบตอนนี้
Kathir

6

คำตอบนี้เป็นเช่นเดียวกับคำตอบของไมค์นี้และคำตอบของเจฟฟ์ทั้งสองชุดredirect_uriไปpostmessageบนฝั่งไคลเอ็นต์ ฉันต้องการเพิ่มเพิ่มเติมเกี่ยวกับฝั่งเซิร์ฟเวอร์และสถานการณ์พิเศษที่ใช้กับการกำหนดค่านี้

กองเทค

แบ็กเอนด์

  • Python 3.6
  • Django 1.11
  • Django REST Framework 3.9 : เซิร์ฟเวอร์เป็น API ไม่แสดงผลเทมเพลตไม่ได้ทำอะไรมาก
  • Django REST Framework JWT 1.11
  • Django REST Social Auth <2.1

ส่วนหน้า

  • ตอบสนอง : 16.8.3 create-react-appรุ่น 2.1.5
  • react-google-login : 5.0.2

โฟลว์ "รหัส" (โดยเฉพาะสำหรับ Google OAuth2)

สรุป: ตอบโต้ -> ขอการรับรองความถูกต้องทางสังคม "รหัส" -> ขอ jwt โทเค็นเพื่อรับสถานะ "เข้าสู่ระบบ" ในแง่ของเซิร์ฟเวอร์ / ฐานข้อมูลแบ็กเอนด์ของคุณเอง

  1. ส่วนหน้า (ตอบโต้) ใช้ "ปุ่มลงชื่อเข้าใช้ Google" พร้อมresponseType="code"รับรหัสการอนุญาต (ไม่ใช่โทเค็นไม่ใช่เข้าสู่โทเค็น!)
    • ปุ่มลงชื่อเข้าใช้ google นั้นมาจากที่react-google-loginกล่าวไว้ข้างต้น
    • คลิกที่ปุ่มจะปรากฏหน้าต่างป๊อปอัพให้ผู้ใช้เลือกบัญชี หลังจากที่ผู้ใช้เลือกหนึ่งและหน้าต่างปิดคุณจะได้รับรหัสจากฟังก์ชั่นการโทรกลับของปุ่ม
  2. ส่วนหน้าส่งสิ่งนี้ไปยังปลายทาง JWT ของเซิร์ฟเวอร์ส่วนหลัง
    • คำขอ POST ด้วย { "provider": "google-oauth2", "code": "your retrieved code here", "redirect_uri": "postmessage" }
  3. สำหรับเซิร์ฟเวอร์ Django ของฉันฉันใช้ Django REST Framework JWT + Django REST Social Auth Django ได้รับรหัสจากส่วนหน้าตรวจสอบด้วยบริการของ Google (ทำเพื่อคุณ) เมื่อตรวจสอบแล้วมันจะส่ง JWT (โทเค็น) กลับไปที่ส่วนหน้า ส่วนหน้าสามารถเก็บเกี่ยวโทเค็นและเก็บไว้ที่ใดที่หนึ่งได้แล้ว
    • ทั้งหมดREST_SOCIAL_OAUTH_ABSOLUTE_REDIRECT_URI, REST_SOCIAL_DOMAIN_FROM_ORIGINและREST_SOCIAL_OAUTH_REDIRECT_URIใน Djangosettings.pyที่ไม่จำเป็น (พวกเขามีค่าคงที่ใช้โดย Django REST สังคมรับรองความถูกต้อง) ในระยะสั้นที่คุณจะได้ไม่ต้องตั้งค่าอะไรที่เกี่ยวข้องกับ URL การเปลี่ยนเส้นทางใน Django "redirect_uri": "postmessage"ในการตอบสนองพอเพียงส่วนหน้า สิ่งนี้สมเหตุสมผลเนื่องจากการรับรองความถูกต้องทางสังคมที่คุณต้องทำในด้านของคุณคือคำขอ POST แบบ Ajax ทั้งหมดในส่วนหน้าไม่ส่งแบบฟอร์มใด ๆ ดังนั้นจึงไม่มีการเปลี่ยนเส้นทางที่เกิดขึ้นจริงตามค่าเริ่มต้น นั่นเป็นสาเหตุที่ URL การเปลี่ยนเส้นทางไม่ได้ผลหากคุณใช้การไหลของรหัส + JWT และการตั้งค่าการเปลี่ยนเส้นทาง URL ฝั่งเซิร์ฟเวอร์จะไม่มีผลใด ๆ
  4. Django REST Social Auth จัดการการสร้างบัญชี ซึ่งหมายความว่าจะตรวจสอบอีเมลบัญชี google / นามสกุลและดูว่ามันตรงกับบัญชีใด ๆ ในฐานข้อมูล มิเช่นนั้นจะเป็นการสร้างให้คุณโดยใช้อีเมลและชื่อจริง แต่ชื่อผู้ใช้จะเป็นสิ่งที่ชอบถ้าอีเมลของคุณyouremailprefix717e248c5b924d60 youremailprefix@example.comมันผนวกสตริงสุ่มบางอย่างเพื่อสร้างชื่อผู้ใช้ที่ไม่ซ้ำกัน นี่คือพฤติกรรมเริ่มต้นผมเชื่อว่าคุณสามารถปรับแต่งมันและรู้สึกอิสระที่จะขุดลงในเอกสารของพวกเขา
  5. ส่วนหน้าร้านค้าที่โทเค็นและเมื่อมีการดำเนินการ CRUD ไปยังเซิร์ฟเวอร์แบ็กเอนด์โดยเฉพาะการสร้าง / ลบ / ปรับปรุงถ้าคุณแนบโทเค็นในAuthorizationส่วนหัวของคุณและส่งคำขอไปยังแบ็กเอนด์ Django แบ็กเอนด์จะรับรู้ว่าเป็นการเข้าสู่ระบบ ผู้ใช้งาน แน่นอนถ้าโทเค็นของคุณหมดอายุคุณต้องรีเฟรชโดยการร้องขออีกครั้ง

โอ้ความดีของฉันฉันใช้เวลามากกว่า 6 ชั่วโมงและได้รับสิทธินี้ในที่สุด! ฉันเชื่อว่านี่เป็นครั้งแรกที่ฉันเห็นpostmessageสิ่งนี้ ทุกคนที่ทำงานกับDjango + DRF + JWT + Social Auth + Reactชุดค่าผสมจะชนกับสิ่งนี้อย่างแน่นอน ฉันไม่อยากจะเชื่อเลยว่าไม่มีบทความกล่าวถึงเรื่องนี้ยกเว้นคำตอบที่นี่ แต่ฉันหวังว่าโพสต์นี้จะช่วยให้คุณประหยัดเวลาได้มากถ้าคุณใช้ Django + React stack


5

2015 กรกฎาคม 15 - การเข้าสู่ระบบที่ทำงานสัปดาห์ที่แล้วด้วยสคริปต์นี้ในการเข้าสู่ระบบ

<script src="https://apis.google.com/js/platform.js" async defer></script>

หยุดทำงานและเริ่มก่อให้เกิดข้อผิดพลาด 400 กับ Error: redirect_uri_mismatch

และในส่วนรายละเอียด: redirect_uri=storagerelay://...

ฉันแก้ไขได้โดยเปลี่ยนเป็น:

<script src="https://apis.google.com/js/client:platform.js?onload=startApp"></script>

พบข้อผิดพลาด 400 เดียวกัน แต่การเปลี่ยนสคริปต์ไม่ทำงานภายใน Cordova WebView ของฉัน
Nick Spacek

@NickSpacek โปรดตรวจสอบว่าเครื่องหมายคำพูดคู่ที่หายไปนั้นมีความรับผิดชอบหรือไม่
tony gil

คุณสามารถช่วยฉันด้วยคำถามของฉัน? stackoverflow.com/questions/37307612/…
LatentDenis

5

รายการตรวจสอบ:

  • httpหรือhttps?
  • &หรือ&amp;?
  • slash ต่อท้าย ( /) หรือเปิด?
  • (CMD/CTRL)+Fค้นหาการจับคู่ที่ตรงกันในหน้าข้อมูลรับรอง หากไม่พบให้ค้นหาสิ่งที่ขาดไป
  • รอจนกว่า google จะรีเฟรช อาจเกิดขึ้นในแต่ละครึ่งชั่วโมงหากคุณเปลี่ยนบ่อยหรืออาจอยู่ในสระน้ำ สำหรับกรณีของฉันมันเกือบจะครึ่งชั่วโมงที่จะมีผล

4

ในกรณีของฉันประเภทของข้อมูลรับรองของฉันคือ "อื่น ๆ " ดังนั้นฉันไม่พบAuthorized redirect URIsในหน้าข้อมูลรับรอง ดูเหมือนว่าจะปรากฏในประเภทแอปพลิเคชัน: "เว็บแอปพลิเคชัน" แต่คุณสามารถคลิกที่Download JSONปุ่มเพื่อรับclient_secret.jsonไฟล์ ป้อนคำอธิบายรูปภาพที่นี่

เปิดแฟ้ม JSON "redirect_uris":["urn:ietf:wg:oauth:2.0:oob","http://localhost"]และคุณสามารถหาพารามิเตอร์เช่นนี้: ฉันเลือกที่จะใช้http: // localhostและมันใช้ได้ดีสำหรับฉัน



4

URL การเปลี่ยนเส้นทางเป็นแบบตรงตามตัวพิมพ์ใหญ่ - เล็ก

ในกรณีของฉันฉันเพิ่มทั้ง: http: // localhost: 5023 / AuthCallback / IndexAsync http: // localhost: 5023 / authcallback / indexasync


1
และระวังด้วยอักขระ "/" ที่ท้าย URL บางครั้งมีความจำเป็นบางครั้งก็ไม่เป็นเช่นนั้น
ajmena

ดังนั้นเราสามารถเก็บ localhost ไว้เป็น request_uri แม้แต่กับเว็บไซต์สด
แตกไม่ได้

4

วิธีการแก้ปัญหาข้างต้นไม่ได้ผลสำหรับฉัน ด้านล่างทำ

เปลี่ยน URL เปลี่ยนเส้นทางที่ได้รับอนุญาตเป็น - https: // localhost: 44377 / signin-google

หวังว่านี่จะช่วยใครซักคน


ถ้าเราใช้ localhost มันจะใช้ได้กับเว็บไซต์ที่เผยแพร่ด้วย ฉันหมายถึงถ้าในคอนโซล API ฉันเพิ่ม URI คำขอ localhost มันจะทำงานอย่างไรเมื่อเว็บไซต์มีชีวิตอยู่? หรือสำหรับเว็บไซต์จริงที่เราต้องใส่ URI จริงอีกชุดไว้ใน API Console?
แตกไม่ได้


3

ผู้ใช้ Rails (จากomniauth-google-oauth2เอกสาร):

แก้ไข Protocol Mismatch สำหรับ redirect_uri ใน Rails

เพียงตั้ง full_host ใน OmniAuth ตาม Rails.env

# config / initializers / omniauth.rb

OmniAuth.config.full_host = Rails.env.production ? ' https://domain.com ': ' http: // localhost: 3000 '

โปรดจำไว้ว่าอย่ารวมส่วนท้าย "/"



2

สำหรับฉันนั่นเป็นเพราะในรายการ 'การเปลี่ยนเส้นทาง URI ที่ได้รับอนุญาต' ฉันใส่ไม่ถูกต้องhttps://developers.google.com/oauthplayground/แทนhttps://developers.google.com/oauthplayground(โดยไม่/สิ้นสุด)


1

ให้ฉันทำคำตอบของ @ Bazyl ให้สมบูรณ์: ในข้อความที่ฉันได้รับพวกเขาพูดถึง URI "http://localhost:8080/" (ซึ่งแน่นอนว่าดูเหมือนว่าจะเป็น google configuration ภายใน) ฉันเปลี่ยน URI ที่ได้รับอนุญาต "http://localhost:8080/"แล้วและข้อความไม่ปรากฏอีกต่อไป ... และวิดีโอที่อัปโหลด ... เอกสาร APIS นั้นอ่อนแอมาก ... ทุกครั้งที่ฉันทำงานกับ google apis ฉันก็แค่ รู้สึกว่า "โชคดี" แต่ไม่มีเอกสารที่ดีเกี่ยวกับเรื่องนี้ .... :( ใช่ฉันทำให้มันทำงานได้ แต่ฉันยังไม่เข้าใจว่าทำไมมันถึงล้มเหลวหรือทำไมมันถึงทำงาน ... มีเพียงหนึ่งเดียว ที่ที่จะยืนยัน URI ในเว็บและมันถูกคัดลอกใน client_secrets.json ... ฉันไม่เข้าใจว่ามีสถานที่ที่สามที่หนึ่งที่ควรจะเขียน URI เดียวกัน ... ฉันค้นหาหรือไม่เพียงเอกสาร แต่ยัง การออกแบบ GUI ของ Google '


1

ทุกคนที่พยายามหาตำแหน่งที่จะตั้งค่า URL การเปลี่ยนเส้นทางในคอนโซลใหม่: API และการรับรองความถูกต้อง -> ข้อมูลรับรอง -> รหัสลูกค้า OAuth 2.0 -> คลิกที่ลิงก์เพื่อค้นหา URL การเปลี่ยนเส้นทางทั้งหมดของคุณ


1

ฉันต้องการสร้างรหัสลูกค้าใหม่ภายใต้ API และบริการ -> ข้อมูลรับรอง -> สร้างข้อมูลรับรอง -> OAuth -> อื่น ๆ

จากนั้นฉันดาวน์โหลดและใช้ client_secret.json กับโปรแกรมบรรทัดคำสั่งของฉันซึ่งกำลังอัปโหลดไปยังบัญชี youtube ของฉัน ฉันพยายามใช้รหัสลูกค้า Web App OAuth ซึ่งทำให้ฉันมีข้อผิดพลาดในการเปลี่ยนเส้นทาง URI ในเบราว์เซอร์


0

ลองทำการตรวจสอบเหล่านี้:

  1. Bundle ID ในคอนโซลและในแอปพลิเคชันของคุณ ฉันชอบชุด Bundle ID ของแอปพลิเคชันเช่นนี้ "org.peredovik. $ {PRODUCT_NAME: rfc1034identifier}"
  2. ตรวจสอบว่าคุณได้เพิ่มประเภท URL ที่แท็บ Info เพียงพิมพ์ Bundle ID ของคุณใน Identifier และ Schemes URL ชุดบทบาทเป็น Editor
  3. ในคอนโซลที่ cloud.google.com "APIs & auth" -> "หน้าจอยินยอม" กรอกแบบฟอร์มเกี่ยวกับแอปพลิเคชันของคุณ ต้องระบุ "ชื่อผลิตภัณฑ์"

สนุก :)


0

ในกรณีของฉันฉันต้องตรวจสอบประเภทรหัสลูกค้าสำหรับเว็บแอปพลิเคชัน / แอปพลิเคชันที่ติดตั้ง

แอปพลิเคชั่นที่ติดตั้ง: http: // localhost [Redirect URIs] ในกรณีนี้ localhost ก็ใช้งานได้

เว็บแอปพลิเคชัน: คุณต้องมีชื่อโดเมนที่ถูกต้อง [Redirect URIs:]


0

สิ่งที่คุณต้องทำคือกลับไปที่คอนโซลนักพัฒนาซอฟต์แวร์ของคุณแล้วไปที่ API & การรับรองความถูกต้อง> หน้าจอแสดงความยินยอมและกรอกข้อมูลนั้น โดยเฉพาะชื่อผลิตภัณฑ์


นอกจากนี้อย่าใช้ชื่อผลิตภัณฑ์ที่ใช้ในโครงการอื่น ตรวจสอบให้แน่ใจว่าเป็นเอกลักษณ์
florisla


0

ฉันมีสอง URI คำขอของในคอนโซล, http: // xxxxx / ลูกค้า / API / สเปรดชีต / authredirectและhttp: // localhost

ฉันลองตอบคำถามทั้งหมดนี้และยืนยันว่าไม่ได้เป็นปัญหาของฉัน

ฉันลบ localhost ออกจากคอนโซลอัปเดต client_secret.json ในโครงการของฉันและข้อผิดพลาดไม่ตรงกันก็หายไป


0

ฉันมีปัญหาเดียวกันกับการลงชื่อเข้าใช้ google ฉันกำลังจะดึงผมของฉัน !!! ฉันป้อนการเรียกกลับของฉันอย่างถูกต้องในแผงข้อมูลรับรองของ Google ที่คอนโซลนักพัฒนาซอฟต์แวร์ของ Google ที่นี่คือ URL การเปลี่ยนเส้นทางของฉัน:

https://www.example.com/signin-google

https://www.example.com/signin-google/

https://www.example.com/oauth2callback

https://www.example.com/oauth2callback/

ทุกอย่างดูดีใช่มั้ย แต่มันยังใช้งานไม่ได้จนกว่าฉันจะเพิ่มUrl ที่มีมนต์ขลังมากกว่านี้ฉันได้เพิ่มsignin-google url (ซึ่งเป็นค่าเริ่มต้นของการติดต่อกลับของ Google) โดยไม่มี wwwและแก้ไขปัญหาแล้ว

คำนึงถึง (ขึ้นอยู่กับโดเมนของคุณ) คุณอาจหรืออาจไม่จำเป็นต้องเพิ่มทั้งที่มีและไม่มี URL


0

ฉันมีแอปส่วนหน้าและ api ส่วนหลัง

จากเซิร์ฟเวอร์เบื้องหลังของฉันฉันกำลังทดสอบโดยการกดปุ่ม Google api และพบข้อผิดพลาดนี้ ในช่วงเวลาทั้งหมดของฉันฉันสงสัยว่าทำไมฉันต้องให้redirect_uriเพราะนี่เป็นเพียงส่วนหลังสำหรับส่วนหน้ามันทำให้รู้สึก

สิ่งที่ฉันทำคือการให้แตกต่างกันredirect_uri(แม้ว่าถูกต้อง) จากเซิร์ฟเวอร์ (สมมติว่านี่เป็นเพียงตัวยึดตำแหน่งมันเพิ่งจะลงทะเบียนกับ Google เท่านั้น) แต่ URL ส่วนหน้าของฉันที่สร้างรหัสโทเค็นแตกต่างกัน ดังนั้นเมื่อฉันส่งรหัสนี้ในการทดสอบฝั่งเซิร์ฟเวอร์ของฉัน (ซึ่งการเปลี่ยนเส้นทาง -uri แตกต่างกัน) ฉันก็พบข้อผิดพลาดนี้

ดังนั้นอย่าทำผิดพลาด ตรวจสอบให้แน่ใจว่าส่วนหน้าของคุณredirect_uriเหมือนกับเซิร์ฟเวอร์ของคุณเหมือน google ใช้เพื่อตรวจสอบความถูกต้อง


0

ด้านล่างนี้คือสาเหตุของข้อผิดพลาด: ปัญหา redirect_uri_mismatch เกิดขึ้น:

  1. เปลี่ยนเส้นทาง URL ช่องว่างที่โครงการ google ของคุณ
  2. URL การเปลี่ยนเส้นทางไม่ตรงกับเว็บไซต์ของคุณ
  3. สิ่งสำคัญ! มันจะทำงานได้เฉพาะกับโดเมนที่ทำงานเช่น example.com, book.com ฯลฯ (ไม่ทำงานกับโฮสต์ท้องถิ่นหรือ URL AWS LB)

แนะนำให้ใช้ URL ของโดเมน


สิ่งที่ควรทำคือ google สร้างการเปลี่ยนเส้นทางที่ผิดพลาดตลอดเวลา มันถูกสร้างขึ้นเป็น localhost: XXXXX ด้วยหมายเลขพอร์ตสุ่มละเว้นการเปลี่ยนเส้นทาง uri ฉันตั้งค่าการสร้างลูกค้า
A. Makarevich

0

เคล็ดลับคือการป้อน URL การเปลี่ยนเส้นทางที่ถูกต้องที่จุดของการสร้าง ID ฉันพบว่าการอัปเดต URL การเปลี่ยนเส้นทางเมื่อสร้างรหัสผ่านทาง 'แก้ไข' แล้วจะไม่ทำงานให้เสร็จ สิ่งที่ใช้งานได้สำหรับฉันก็คือการทำซ้ำทั้งโฟลเดอร์ 'ผู้ขาย' และคัดลอกไปยังตำแหน่งเดียวกันกับที่ไฟล์ 'oauth' (จนกระทั่งคุณสร้างโทเค็นสำเร็จแล้วคุณสามารถลบโฟลเดอร์ 'ผู้ขายซ้ำ' ได้) เนื่องจากพยายามชี้ไปที่โฟลเดอร์ผู้จำหน่ายผ่าน '../vendor/autoload' ไม่ทำงานสำหรับฉัน

ดังนั้นลบ OAuth ID ลูกค้าที่มีปัญหาของคุณแล้วลองใช้วิธีนี้มันจะใช้งานได้

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.