invalid_grant พยายามรับโทเค็น oAuth จาก Google


121

ฉันได้รับinvalid_grantข้อผิดพลาดในการพยายามรับโทเค็น oAuth จาก Google เพื่อเชื่อมต่อกับ API ผู้ติดต่อ ข้อมูลทั้งหมดถูกต้องและฉันได้ตรวจสอบ Tripple แบบนี้แล้ว

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


สำหรับฉันปัญหาอยู่ในหน้าข้อมูลรับรองของ Google ... ฉันสร้างอีกอัน ... และแก้ไขปัญหา ....
costamatrix

คำตอบ:


59

ฉันพบปัญหานี้เมื่อไม่ได้ร้องขอการเข้าถึงแบบ "ออฟไลน์" อย่างชัดเจนเมื่อส่งผู้ใช้ไปที่ OAuth "คุณต้องการให้สิทธิ์แอปนี้สัมผัสสิ่งของของคุณหรือไม่" หน้า.

ตรวจสอบว่าคุณระบุ access_type = offline ในคำขอของคุณ

ดูรายละเอียดที่นี่: https://developers.google.com/accounts/docs/OAuth2WebServer#offline

(เช่นกัน: ฉันคิดว่า Google ได้เพิ่มข้อ จำกัด นี้ในปลายปี 2011 หากคุณมีโทเค็นเก่าก่อนหน้านั้นคุณจะต้องส่งผู้ใช้ของคุณไปยังหน้าการอนุญาตเพื่ออนุญาตการใช้งานออฟไลน์)


9
@ แอดเห็นด้วย ฉันตั้งค่าaccess_typeเป็นofflineข้อผิดพลาดนี้ยังคงเกิดขึ้น
สไลด์โชว์ 2

นี่ไม่ควรเป็นคำตอบที่ยอมรับได้
Kishan Solanki

ไปผ่านทางนี้developers.google.com/android-publisher/authorizationเอกสารและการอ่านทุกอย่างที่จะใช้
Kishan Solanki

70

ฉันพบปัญหาเดียวกันนี้แม้ว่าจะระบุ "ออฟไลน์" access_typeในคำขอตามคำตอบของ bonkydog เรื่องสั้นฉันพบว่าวิธีแก้ปัญหาที่อธิบายไว้ที่นี่ใช้ได้ผลสำหรับฉัน:

https://groups.google.com/forum/#!topic/google-analytics-data-export-api/4uNaJtquxCs

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

สิ่งนี้ใช้เมื่อเรียก URL ทั้งสองนี้:

โปรดทราบว่าการเรียกไปยัง URL แรกจะสำเร็จหากคุณเรียกด้วย "รหัสลูกค้า" แทน "ที่อยู่อีเมล" ของคุณ อย่างไรก็ตามการใช้รหัสที่ส่งคืนจากคำขอนั้นจะใช้ไม่ได้เมื่อพยายามรับโทเค็นผู้ถือจาก URL ที่สอง แต่คุณจะได้รับข้อความ "Error 400" และ "invalid_grant" แทน


66
ไร้สาระอย่างยิ่ง: โดยเฉพาะส่วนที่ทำงานกับ client_id หากคุณได้รับโทเค็นการรีเฟรชเริ่มต้น Googles API และเอกสารประกอบเป็นเรื่องยุ่ง
Traubenfuchs

7
ฉันต่อสู้กับปัญหานี้มาหลายชั่วโมงแล้ว ฉันไม่เคยคาดหวังมาก่อนว่า 'client_id' ไม่ใช่สิ่งที่คาดหวังสำหรับฟิลด์ 'client_id' ยกเว้นบางครั้งบางคราวเมื่อคุณได้รับ refresh_token และมันใช้งานได้ ค่อนข้างแน่ใจว่าคำที่ฉันมีสำหรับ Google ในขณะนี้ไม่สามารถพูดใน SO ได้
Justin

6
สวัสดี .. ฉันไม่พบที่อยู่ "อีเมล" ที่พวกคุณพูดถึง นี่คือสิ่งที่ฉันมีในคอนโซลของฉัน -> pbs.twimg.com/media/CVVcEBWUwAAIiCy.png:large
omarojo

4
ที่อยู่อีเมลนั้นอยู่ที่ไหน ฉันมีปัญหาเดียวกัน
Isma Haro

4
อย่าเชื่อถือเอกสารของ Google เอกสารและ API ที่น่ากลัวที่สุดมาจาก Google ซึ่งเป็น บริษัท ที่มีค่าที่สุดในโลก ฉันต้องใช้เวลานับไม่ถ้วนเพื่อใช้ Google API มีปัญหาหลังจากเกิดปัญหาแล้วไลบรารี. Net ของตนเองสำหรับ API ต่างๆที่ไม่ได้รวบรวมเข้าด้วยกันเนื่องจากปัญหาการพึ่งพาที่แตกต่างกันและทั้งหมด ตอนนี้โค้ดใช้งานได้ดีสำหรับผู้ใช้ส่วนใหญ่ แต่สำหรับผู้ใช้บางรายฉันยังคงได้รับ invalid_grant, invalid_credentials ฯลฯ โดยไม่มีเหตุผลใด ๆ
Allen King

56

แม้ว่านี่จะเป็นคำถามเก่า แต่ดูเหมือนว่าหลายคนยังคงพบเจอ - เราใช้เวลาหลายวันในการติดตามเรื่องนี้ด้วยตัวเอง

ในข้อมูลจำเพาะ OAuth2 "invalid_grant" เป็นประเภทของการตรวจจับทั้งหมดสำหรับข้อผิดพลาดทั้งหมดที่เกี่ยวข้องกับโทเค็นที่ไม่ถูกต้อง / หมดอายุ / ถูกเพิกถอน (การให้สิทธิ์การตรวจสอบสิทธิ์หรือการรีเฟรชโทเค็น)

สำหรับเราปัญหาคือสองเท่า:

  1. ผู้ใช้ได้เพิกถอนการเข้าถึงแอปของเรา
    แล้วก็สมเหตุสมผล แต่รับสิ่งนี้: 12 ชั่วโมงหลังจากการเพิกถอนGoogle จะหยุดส่งข้อความแสดงข้อผิดพลาดในการตอบสนอง: “error_description” : “Token has been revoked.”
    ค่อนข้างทำให้เข้าใจผิดเพราะคุณจะถือว่าข้อความแสดงข้อผิดพลาดอยู่ที่นั่นตลอดเวลาซึ่งไม่ กรณี. คุณสามารถตรวจสอบว่าแอปของคุณยังคงมีการเข้าถึงที่หน้าปพลิเคชันได้รับอนุญาต

  2. ผู้ใช้รีเซ็ต / กู้คืนรหัสผ่าน Google ของตน
    ในเดือนธันวาคม 2558 Google ได้เปลี่ยนพฤติกรรมเริ่มต้นเพื่อให้รีเซ็ตรหัสผ่านสำหรับผู้ใช้ที่ไม่ใช่ Google Apps จะเพิกถอนโทเค็นการรีเฟรชแอปทั้งหมดของผู้ใช้โดยอัตโนมัติ ในการเพิกถอนข้อความแสดงข้อผิดพลาดจะเป็นไปตามกฎเดียวกันกับกรณีก่อนหน้านี้ดังนั้นคุณจะได้รับ "error_description" ในช่วง 12 ชั่วโมงแรกเท่านั้น ดูเหมือนจะไม่มีทางทราบได้ว่าผู้ใช้เพิกถอนการเข้าถึงด้วยตนเอง (โดยเจตนา) หรือเกิดขึ้นเนื่องจากการรีเซ็ตรหัสผ่าน (ผลข้างเคียง)

นอกเหนือจากนั้นยังมีสาเหตุอื่น ๆ อีกมากมายที่อาจทำให้เกิดข้อผิดพลาด:

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

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


1
อีกสถานการณ์หนึ่งคือหากคุณพยายามรับโทเค็นหลาย ๆ ครั้งโดยใช้รหัสรับรองความถูกต้องเดียวกัน
knownasilya

นั่นเป็นปัญหาของฉันเพียงแค่เพิกถอนแอปโดยไม่ได้ตั้งใจ จากนั้นต้องเรียกใช้ refreshToken.php อีกครั้งผ่านเทอร์มินัลเพื่อสร้างรหัสการอนุญาตอื่นจากนั้นแทนที่ refreshToken ทุกที่สำหรับรหัสไคลเอ็นต์นี้
Robert Sinclair

7

ฉันพบปัญหาเดียวกัน สำหรับฉันฉันแก้ไขสิ่งนี้โดยใช้ที่อยู่อีเมล (สตริงที่ลงท้ายด้วย ... @ developer.gserviceaccount.com) แทนรหัสไคลเอ็นต์สำหรับค่าพารามิเตอร์ client_id การตั้งชื่อโดย Google ทำให้เกิดความสับสนที่นี่


6
นี่เป็นคำตอบเดียวกับที่ได้รับจาก @aroth เมื่อกว่าหนึ่งปีก่อน
ไบรอันแอช

3

ปัญหาของฉันคือฉันใช้ URL นี้:

https://accounts.google.com/o/oauth2/token

เมื่อใดที่ฉันควรใช้ URL นี้:

https://www.googleapis.com/oauth2/v4/token

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


2

ฉันมีข้อความแสดงข้อผิดพลาดเดียวกัน 'invalid_grant' และเป็นเพราะการส่ง authResult ['code'] จากจาวาสคริปต์ฝั่งไคลเอ็นต์ไม่ได้รับอย่างถูกต้องบนเซิร์ฟเวอร์

ลองเอาท์พุทกลับจากเซิร์ฟเวอร์เพื่อดูว่าถูกต้องและไม่ใช่สตริงว่างเปล่า


1

หากคุณใช้ไลบรารีอาลักษณ์เพียงตั้งค่าโหมดออฟไลน์เช่น bonkydog ที่แนะนำนี่คือรหัส:

OAuthService service = new ServiceBuilder().provider(Google2Api.class).apiKey(clientId).apiSecret(apiSecret)
                .callback(callbackUrl).scope(SCOPE).offline(true)
                .build();

https://github.com/codolutions/scribe-java/


1

การใช้ไคลเอนต์ Android (ไม่มี client_secret) ฉันได้รับการตอบสนองข้อผิดพลาดต่อไปนี้:

{
 "error": "invalid_grant",
 "error_description": "Missing code verifier."
}

ฉันไม่พบเอกสารใด ๆ สำหรับฟิลด์ 'code_verifier' แต่ฉันพบว่าหากคุณตั้งค่าให้เท่ากันทั้งในคำขอการอนุญาตและโทเค็นมันจะลบข้อผิดพลาดนี้ ฉันไม่แน่ใจว่าค่าที่ตั้งใจไว้ควรเป็นเท่าใดหรือควรจะปลอดภัย มีความยาวขั้นต่ำ (16? อักขระ) แต่ฉันพบว่าการตั้งค่าnullยังใช้งานได้

ฉันใช้ AppAuth สำหรับคำขอการอนุญาตในไคลเอนต์ Android ของฉันซึ่งมีsetCodeVerifier()ฟังก์ชัน

AuthorizationRequest authRequest = new AuthorizationRequest.Builder(
                                    serviceConfiguration,
                                    provider.getClientId(),
                                    ResponseTypeValues.CODE,
                                    provider.getRedirectUri()
                            )
                            .setScope(provider.getScope())
                            .setCodeVerifier(null)
                            .build();

นี่คือตัวอย่างคำขอโทเค็นในโหนด:

request.post(
  'https://www.googleapis.com/oauth2/v4/token',
  { form: {
    'code': '4/xxxxxxxxxxxxxxxxxxxx',
    'code_verifier': null,
    'client_id': 'xxxxxxxxxxxxxxxxxxxxxx.apps.googleusercontent.com',
    'client_secret': null,
    'redirect_uri': 'com.domain.app:/oauth2redirect',
    'grant_type': 'authorization_code'
  } },
  function (error, response, body) {
    if (!error && response.statusCode == 200) {
      console.log('Success!');
    } else {
      console.log(response.statusCode + ' ' + error);
    }

    console.log(body);
  }
);

ฉันทดสอบแล้วและใช้ได้กับทั้งสองอย่างhttps://www.googleapis.com/oauth2/v4/tokenและhttps://accounts.google.com/o/oauth2/token.

หากคุณใช้GoogleAuthorizationCodeTokenRequestแทน:

final GoogleAuthorizationCodeTokenRequest req = new GoogleAuthorizationCodeTokenRequest(
                    TRANSPORT,
                    JSON_FACTORY,
                    getClientId(),
                    getClientSecret(),
                    code,
                    redirectUrl
);
req.set("code_verifier", null);          
GoogleTokenResponse response = req.execute();

1

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

มีคำตอบอื่น ๆ มากมายเกี่ยวกับ SO สำหรับเอฟเฟกต์นี้เช่น Reset Client Secret OAuth2 - ลูกค้าจำเป็นต้องให้สิทธิ์การเข้าถึงอีกครั้งหรือไม่?


1

คุณอาจต้องลบการตอบสนอง OAuth ที่เก่า / ไม่ถูกต้องออก

เครดิต: node.js google oauth2 ตัวอย่างหยุดทำงาน invalid_grant

หมายเหตุ : การตอบสนอง OAuth จะไม่ถูกต้องเช่นกันหากรหัสผ่านที่ใช้ในการอนุญาตครั้งแรกมีการเปลี่ยนแปลง

หากอยู่ในสภาพแวดล้อม bash คุณสามารถใช้สิ่งต่อไปนี้เพื่อลบการตอบสนองที่ค้าง:

rm /Users/<username>/.credentials/<authorization.json>


1

มีสาเหตุหลักสองประการสำหรับข้อผิดพลาดinvalid_grantซึ่งคุณต้องดูแลก่อนการร้องขอ POST สำหรับ Refresh Token และ Access Token

  1. ส่วนหัวของคำขอต้องมี "content-type: application / x-www-form-urlencoded"
  2. เพย์โหลดคำขอของคุณควรเข้ารหัส URL แบบฟอร์มข้อมูลอย่าส่งเป็นวัตถุ json

RFC 6749 OAuth 2.0กำหนดinvalid_grantเป็น: การให้สิทธิ์ที่ให้ไว้ (เช่นรหัสการอนุญาตข้อมูลประจำตัวของเจ้าของทรัพยากร) หรือโทเค็นการรีเฟรชไม่ถูกต้องหมดอายุเพิกถอนไม่ตรงกับ URI การเปลี่ยนเส้นทางที่ใช้ในคำขอการอนุญาตหรือออกให้กับไคลเอนต์อื่น .

ฉันพบบทความดีๆอีกบทความหนึ่งที่นี่คุณจะพบสาเหตุอื่น ๆ อีกมากมายสำหรับข้อผิดพลาดนี้

https://blog.timekit.io/google-oauth-invalid-grant-nightmare-and-how-to-fix-it-9f4efaf1da35


คุณต้องการโพสต์คำตอบที่เหมือนกันเกือบสองคำใช่หรือไม่ คุณอาจต้องการลบรายการนี้เนื่องจากอีกรายการมีบรรทัดเพิ่มเติม
Blastfurnace

1

หากคุณกำลังทดสอบสิ่งนี้ในบุรุษไปรษณีย์ / โรคนอนไม่หลับและกำลังพยายามทำให้มันใช้งานได้คำแนะนำ: รหัสรับรองความถูกต้องของเซิร์ฟเวอร์ (พารามิเตอร์รหัส) จะใช้ได้เพียงครั้งเดียว หมายความว่าหากคุณกรอกพารามิเตอร์อื่น ๆ ในคำขอและรับ 400 คืนคุณจะต้องใช้รหัสรับรองความถูกต้องของเซิร์ฟเวอร์ใหม่ไม่เช่นนั้นคุณจะได้รับอีก 400


0

ในไซต์นี้ console.developers.google.com

บอร์ดคอนโซลนี้เลือกอินพุตโครงการของคุณใน url คำสาบาน oauth callback url จะเปลี่ยนเส้นทางเมื่อ oauth สำเร็จ


0

หลังจากพิจารณาและลองใช้วิธีอื่น ๆ ทั้งหมดแล้วนี่คือวิธีที่ฉันแก้ไขปัญหาใน nodejs ด้วยgoogleapisโมดูลร่วมกับrequestโมดูลซึ่งฉันใช้ในการดึงโทเค็นแทนgetToken()วิธีที่ให้มา:

const request = require('request');

//SETUP GOOGLE AUTH
var google = require('googleapis');
const oAuthConfigs = rootRequire('config/oAuthConfig')
const googleOAuthConfigs = oAuthConfigs.google

//for google OAuth: https://github.com/google/google-api-nodejs-client
var OAuth2 = google.auth.OAuth2;
var googleOAuth2Client = new OAuth2(
    process.env.GOOGLE_OAUTH_CLIENT_ID || googleOAuthConfigs.clientId, 
    process.env.GOOGLE_OAUTH_CLIENT_SECRET || googleOAuthConfigs.clientSecret, 
    process.env.GOOGLE_OAUTH_CLIENT_REDIRECT_URL || googleOAuthConfigs.callbackUrl);

/* generate a url that asks permissions for Google+ and Google Calendar scopes
https://developers.google.com/identity/protocols/googlescopes#monitoringv3*/
var googleOAuth2ClientScopes = [
    'https://www.googleapis.com/auth/plus.me',
    'https://www.googleapis.com/auth/userinfo.email'
];

var googleOAuth2ClientRedirectURL = process.env.GOOGLE_OAUTH_CLIENT_REDIRECT_URL || googleOAuthConfigs.callbackUrl; 

var googleOAuth2ClientAuthUrl = googleOAuth2Client.generateAuthUrl({
  access_type: 'offline', // 'online' (default) or 'offline' (gets refresh_token)
  scope: googleOAuth2ClientScopes // If you only need one scope you can pass it as string
});

//AFTER SETUP, THE FOLLOWING IS FOR OBTAINING TOKENS FROM THE AUTHCODE


        const ci = process.env.GOOGLE_OAUTH_CLIENT_ID || googleOAuthConfigs.clientId
        const cs = process.env.GOOGLE_OAUTH_CLIENT_SECRET || googleOAuthConfigs.clientSecret
        const ru = process.env.GOOGLE_OAUTH_CLIENT_REDIRECT_URL || googleOAuthConfigs.callbackUrl
        var oauth2Client = new OAuth2(ci, cs, ru);

        var hostUrl = "https://www.googleapis.com";
        hostUrl += '/oauth2/v4/token?code=' + authCode + '&client_id=' + ci + '&client_secret=' + cs + '&redirect_uri=' + ru + '&grant_type=authorization_code',
        request.post({url: hostUrl}, function optionalCallback(err, httpResponse, data) {
            // Now tokens contains an access_token and an optional refresh_token. Save them.
            if(!err) {
                //SUCCESS! We got the tokens
                const tokens = JSON.parse(data)
                oauth2Client.setCredentials(tokens);

                //AUTHENTICATED PROCEED AS DESIRED.
                googlePlus.people.get({ userId: 'me', auth: oauth2Client }, function(err, response) {
                // handle err and response
                    if(!err) {
                        res.status(200).json(response);
                    } else {
                        console.error("/google/exchange 1", err.message);
                        handleError(res, err.message, "Failed to retrieve google person");
                    }
                });
            } else {
                console.log("/google/exchange 2", err.message);
                handleError(res, err.message, "Failed to get access tokens", err.code);
            }
        });

ฉันใช้requestเพื่อส่งคำขอ api ผ่าน HTTP ตามที่อธิบายไว้ที่นี่: https://developers.google.com/identity/protocols/OAuth2WebServer#offline

POST /oauth2/v4/token HTTP/1.1
Host: www.googleapis.com
Content-Type: application/x-www-form-urlencoded

code=4/P7q7W91a-oMsCeLvIaQm6bTrgtp7&
client_id=8819981768.apps.googleusercontent.com&
client_secret={client_secret}&
redirect_uri=https://oauth2.example.com/code&
grant_type=authorization_code


0

สำหรับคนในอนาคต ... ฉันอ่านบทความและบล็อกมากมาย แต่โชคดีด้วยวิธีแก้ปัญหาด้านล่าง ...

GoogleTokenResponse tokenResponse =
      new GoogleAuthorizationCodeTokenRequest(
          new NetHttpTransport(),
          JacksonFactory.getDefaultInstance(),
          "https://www.googleapis.com/oauth2/v4/token",
          clientId,
          clientSecret,
          authCode,
          "") //Redirect Url
     .setScopes(scopes)
     .setGrantType("authorization_code")
     .execute();

บล็อกนี้แสดงกรณีต่างๆที่เกิดข้อผิดพลาด "invalid_grant"

สนุก!!!


0

สำหรับฉันฉันต้องตรวจสอบให้แน่ใจว่าสิ่งredirect_uriนี้ตรงกันทุกประการกับคอนโซลนักพัฒนาซอฟต์แวร์Authorised redirect URIsซึ่งได้รับการแก้ไขแล้วสำหรับฉันฉันสามารถแก้ไขข้อบกพร่องและรู้ว่าอะไรคือปัญหาหลังจากเปลี่ยนจาก https://accounts.google.com/o/oauth2/tokenเป็นhttps://www.googleapis.com/oauth2/v4/token

ฉันได้รับข้อผิดพลาดที่เหมาะสม:

{"error": "redirect_uri_mismatch",  "error_description": "Bad Request"}

0

ฉันประสบปัญหานี้หลังจากเปิดใช้ API บริการใหม่บนคอนโซลของ Google และพยายามใช้ข้อมูลรับรองที่ทำไว้ก่อนหน้านี้

ในการแก้ไขปัญหาที่ผมต้องกลับไปที่หน้ารับรองการคลิกที่ชื่อหนังสือรับรองและคลิก "บันทึก" อีกครั้ง หลังจากนั้นฉันสามารถตรวจสอบสิทธิ์ได้ดี


0

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

รหัสของฉันก่อนการแก้ไข:

def gc_service
      oauth_client = Signet::OAuth2::Client.new(client_options)
      oauth_client.code = params[:code]
      response = oauth_client.fetch_access_token!
      session[:authorization] = response
      oauth_client.update!(session[:authorization])

      gc_service = Google::Apis::CalendarV3::CalendarService.new
      gc_service.authorization = oauth_client

      gc_service
    end
primary_calendar_id = gc_service.list_calendar_lists.items.select(&:primary).first.id

gc_service.insert_acl(primary_calendar_id, acl_rule_object, send_notifications: false)

ทันทีที่ฉันเปลี่ยนเป็น (ใช้เพียงอินสแตนซ์เดียว):

@gc_service = gc_service
primary_calendar_id = @gc_service.list_calendar_lists.items.select(&:primary).first.id

@gc_service.insert_acl(primary_calendar_id, acl_rule_object, send_notifications: false)

มันแก้ไขปัญหาของฉันเกี่ยวกับประเภทการให้สิทธิ์


0

สำหรับฉันปัญหาคือฉันมีไคลเอนต์หลายรายในโครงการของฉันและฉันค่อนข้างแน่ใจว่านี่ใช้ได้อย่างสมบูรณ์แบบ แต่ฉันลบไคลเอนต์ทั้งหมดสำหรับโปรเจ็กต์นั้นและสร้างไคลเอนต์ใหม่และทั้งหมดก็เริ่มทำงานให้ฉัน (รับแนวคิดนี้จากปลั๊กอิน WP_SMTP ช่วยด้วย ฟอรัมการสนับสนุน) ฉันไม่พบลิงค์นั้นเพื่อใช้อ้างอิง


0

หากคุณกำลังล้างข้อมูลผู้ใช้ (ตัวอย่างเช่น$_GET["code"]ใน php) ตรวจสอบให้แน่ใจว่าคุณไม่ได้แทนที่บางอย่างในโค้ดโดยไม่ได้ตั้งใจ

regex ที่ฉันใช้อยู่ตอนนี้ /[^A-Za-z0-9\/-]/


0

ดูที่https://dev.to/risafj/beginner-s-guide-to-oauth-understand-access-tokens-and-authorization-codes-2988

ก่อนอื่นคุณต้องมี access_token:

$code = $_GET['code'];

$clientid = "xxxxxxx.apps.googleusercontent.com";
$clientsecret = "xxxxxxxxxxxxxxxxxxxxx";

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, "https://www.googleapis.com/oauth2/v4/token");
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, "client_id=".urlencode($clientid)."&client_secret=".urlencode($clientsecret)."&code=".urlencode($code)."&grant_type=authorization_code&redirect_uri=". urlencode("https://yourdomain.com"));
curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-Type: application/x-www-form-urlencoded'));

curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$server_output = curl_exec($ch);
curl_close ($ch);

$server_output = json_decode($server_output);
$access_token = $server_output->access_token;
$refresh_token = $server_output->refresh_token;
$expires_in = $server_output->expires_in;

ปลอดภัย Access Token และ Refresh Token และ expire_in ในฐานข้อมูล โทเค็นการเข้าถึงจะหมดอายุหลังจาก $ expires_in วินาที กว่าที่คุณจะต้องคว้า Access Token ใหม่ (และปลอดภัยในฐานข้อมูล) ด้วยคำขอต่อไปนี้:

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, "https://www.googleapis.com/oauth2/v4/token");
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, "client_id=".urlencode($clientid)."&client_secret=".urlencode($clientsecret)."&refresh_token=".urlencode($refresh_token)."&grant_type=refresh_token");
curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-Type: application/x-www-form-urlencoded'));

curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$server_output = curl_exec($ch);
curl_close ($ch);

$server_output = json_decode($server_output);
$access_token = $server_output->access_token;
$expires_in = $server_output->expires_in;

โปรดทราบว่าต้องเพิ่มโดเมน redirect_uri ไปยังโดเมนของคุณใน Google Console: https://console.cloud.google.com/apis/credentialsในแท็บ "OAuth 2.0-Client-IDs" นอกจากนี้คุณยังพบรหัสลูกค้าและรหัสลับลูกค้าของคุณ


0

มีการหมดเวลาที่ไม่มีเอกสารระหว่างเมื่อคุณเปลี่ยนเส้นทางผู้ใช้ไปยังหน้าการตรวจสอบสิทธิ์ของ Google เป็นครั้งแรก (และรับรหัสกลับมา) และเมื่อคุณรับรหัสที่ส่งคืนและโพสต์ลงในโทเค็น URL ใช้งานได้ดีสำหรับฉันกับ client_id ที่ Google ให้มาจริงซึ่งต่างจาก "ที่อยู่อีเมลที่ไม่มีเอกสาร" ฉันแค่ต้องเริ่มกระบวนการอีกครั้ง

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