không hợp lệ_grant cố lấy mã thông báo oAuth từ google


120

Tôi liên tục gặp invalid_grantlỗi khi cố gắng nhận mã thông báo oAuth từ Google để kết nối với api liên hệ của họ. Tất cả các thông tin là chính xác và tôi đã kiểm tra bộ ba này rất khó hiểu.

Có ai biết những gì có thể gây ra vấn đề này? Tôi đã thử thiết lập một id khách hàng khác cho nó nhưng tôi nhận được cùng một kết quả, tôi đã thử kết nối nhiều cách khác nhau bao gồm cả thử xác thực lực lượng, nhưng vẫn cho kết quả tương tự.


Đối với tôi, vấn đề là ở trang thông tin đăng nhập google ... tôi đã tạo một cái khác ... và đã giải quyết vấn đề ....
costamatrix

Câu trả lời:


59

Tôi gặp phải vấn đề này khi tôi không yêu cầu quyền truy cập "ngoại tuyến" rõ ràng khi gửi người dùng đến OAuth "Bạn có muốn cho phép ứng dụng này chạm vào nội dung của bạn không?" trang.

Đảm bảo bạn chỉ định access_type = offline trong yêu cầu của bạn.

Chi tiết tại đây: https://developers.google.com/accounts/docs/OAuth2WebServer#offline

(Ngoài ra: Tôi nghĩ rằng Google đã thêm hạn chế này vào cuối năm 2011. Nếu trước đó bạn đã có mã thông báo cũ, bạn sẽ cần gửi người dùng của mình đến trang cấp phép để cho phép sử dụng ngoại tuyến.)


9
@Adders tôi đồng ý. Tôi đặt access_typethành offline, lỗi này vẫn xảy ra.
slideshowp2

Đây không phải là câu trả lời được chấp nhận.
Kishan Solanki

Xem qua tài liệu dành cho nhà phát
triển.google.com/android

70

Tôi gặp vấn đề tương tự mặc dù chỉ định "ngoại tuyến" access_typetrong yêu cầu của tôi theo câu trả lời của bonkydog. Câu chuyện dài tôi thấy rằng giải pháp được mô tả ở đây có hiệu quả với tôi:

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

Về bản chất, khi bạn thêm Máy khách OAuth2 trong bảng điều khiển Google API của mình, Google sẽ cung cấp cho bạn "ID khách hàng" và "Địa chỉ email" (giả sử bạn chọn "webapp" làm loại máy khách của mình). Và mặc dù các quy ước đặt tên sai lệch của Google, họ vẫn mong bạn gửi "Địa chỉ email" làm giá trị của client_idtham số khi bạn truy cập API OAuth2 của họ.

Điều này áp dụng khi gọi cả hai URL này:

Lưu ý rằng các cuộc gọi đến URL đầu tiên sẽ thành công nếu bạn gọi nó với "ID Client" của bạn thay vì "địa chỉ Email" của bạn. Tuy nhiên, việc sử dụng mã được trả về từ yêu cầu đó sẽ không hoạt động khi cố gắng nhận mã thông báo mang từ URL thứ hai. Thay vào đó, bạn sẽ nhận được thông báo 'Lỗi 400' và thông báo "không hợp lệ".


66
Hoàn toàn vô lý: Đặc biệt là phần hoạt động với client_id nếu bạn nhận được mã thông báo làm mới ban đầu. Googles API và tài liệu của họ là một mớ hỗn độn.
Traubenfuchs 4/03/2015

7
Tôi đã đập đầu vào vấn đề này trong nhiều giờ. Tôi không bao giờ mong đợi rằng 'client_id' không phải là điều được mong đợi cho trường 'client_id'. Ngoại trừ thời gian thỉnh thoảng khi bạn nhận được refresh_token và nó hoạt động. Khá chắc chắn những từ tôi có cho google vào lúc này không thể nói trên SO.
Justin

6
Xin chào .. Tôi không thể tìm thấy địa chỉ "email" mà các bạn đang nói đến. đây là những gì tôi có trong bảng điều khiển của mình -> pbs.twimg.com/media/CVVcEBWUwAAIiCy.png:large
omarojo

4
Địa chỉ email đó ở đâu? Tôi đang gặp vấn đề tương tự
Isma Haro

4
Không bao giờ tin tưởng vào tài liệu của Google. Tài liệu và API tào lao nhất đến từ Google, công ty có giá trị nhất trên thế giới. Tôi đã phải dành vô số giờ để sử dụng Google API. Có các vấn đề sau các vấn đề và sau đó là các thư viện .Net của riêng họ cho các API khác nhau không được biên dịch cùng nhau do các vấn đề phụ thuộc khác nhau và tất cả. Mã hiện hoạt động tốt đối với hầu hết người dùng nhưng đối với một số người dùng, tôi vẫn nhận được không hợp lệ, không hợp lệ, không có lý do cụ thể.
Allen King

56

Mặc dù đây là một câu hỏi cũ, nhưng có vẻ như nhiều người vẫn gặp phải nó - chúng tôi đã dành nhiều ngày để tự mình theo dõi điều này.

Trong thông số OAuth2, "không hợp lệ" là loại bắt tất cả cho tất cả các lỗi liên quan đến mã thông báo không hợp lệ / hết hạn / bị thu hồi (cấp mã xác thực hoặc mã thông báo làm mới).

Đối với chúng tôi, vấn đề là hai lần:

  1. Người dùng đã chủ động thu hồi quyền truy cập vào ứng dụng của chúng tôi
    Có ý nghĩa, nhưng nhận được điều này: 12 giờ sau khi hủy bỏ, Google dừng gửi thông báo lỗi trong phản hồi của họ: “error_description” : “Token has been revoked.”
    Điều đó khá sai lầm bởi vì bạn sẽ cho rằng thông báo lỗi không có ở mọi lúc trường hợp. Bạn có thể kiểm tra xem ứng dụng của bạn có còn quyền truy cập tại trang cấp phép ứng dụng hay không .

  2. Người dùng đã đặt lại / khôi phục mật khẩu Google của họ
    Vào tháng 12 năm 2015, Google đã thay đổi hành vi mặc định của họ để đặt lại mật khẩu cho người dùng không phải là Google Apps sẽ tự động thu hồi tất cả các mã thông báo làm mới ứng dụng của người dùng. Khi hủy bỏ, thông báo lỗi tuân theo quy tắc giống như trường hợp trước đó, vì vậy bạn sẽ chỉ nhận được "error_description" trong 12 giờ đầu tiên. Dường như không có bất kỳ cách nào để biết liệu người dùng đã thu hồi quyền truy cập theo cách thủ công (có chủ ý) hay nó đã xảy ra do đặt lại mật khẩu (tác dụng phụ).

Ngoài những nguyên nhân đó, còn có vô số nguyên nhân tiềm ẩn khác có thể gây ra lỗi:

  1. Đồng hồ / giờ của máy chủ không đồng bộ
  2. Không được phép truy cập ngoại tuyến
  3. Điều chỉnh bởi Google
  4. Sử dụng mã thông báo làm mới đã hết hạn
  5. Người dùng đã không hoạt động được 6 tháng.
  6. Sử dụng email nhân viên dịch vụ thay vì ID khách hàng
  7. Quá nhiều mã thông báo truy cập trong thời gian ngắn
  8. SDK khách hàng có thể bị lỗi thời
  9. Mã thông báo làm mới không chính xác / không đầy đủ

Tôi đã viết một bài viết ngắn tóm tắt từng mục với một số hướng dẫn gỡ lỗi để giúp tìm ra thủ phạm. Hy vọng nó giúp.


1
Một kịch bản khác là nếu bạn cố gắng nhận mã thông báo nhiều lần tạo thành cùng một mã xác thực.
biết đến

Đó chính xác là vấn đề của tôi, chỉ đơn giản là thu hồi ứng dụng một cách tình cờ. Sau đó phải chạy lại refreshToken.php thông qua thiết bị đầu cuối để tạo mã ủy quyền khác và sau đó thay thế refreshToken ở mọi nơi cho clientID này.
Robert Sinclair

7

Tôi gặp phải vấn đề tương tự. Đối với tôi, tôi đã sửa lỗi này bằng cách sử dụng Địa chỉ Email (chuỗi kết thúc bằng ... @ developer.gserviceaccount.com) thay vì ID khách hàng cho giá trị tham số client_id. Việc đặt tên do Google đặt ra gây nhầm lẫn ở đây.


6
Đây là câu trả lời tương tự được đưa ra bởi @aroth hơn một năm trước
Bryan Ash

3

Vấn đề của tôi là tôi đã sử dụng URL này:

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

Khi tôi nên sử dụng URL này:

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

Đây là thử nghiệm tài khoản dịch vụ muốn truy cập ngoại tuyến vào Công cụ lưu trữ .


2

Tôi đã có cùng một thông báo lỗi 'không hợp lệ' và đó là do authResult ['code'] gửi từ phía máy khách javascript không được nhận chính xác trên máy chủ.

Hãy thử xuất nó trở lại từ máy chủ để xem nó có đúng không và không phải là một chuỗi rỗng.


1

nếu bạn đang sử dụng thư viện scribe, chỉ cần thiết lập chế độ ngoại tuyến, như bonkydog được đề xuất ở đây là mã:

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

Sử dụng ứng dụng khách Android (không có client_secret) Tôi nhận được phản hồi lỗi sau:

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

Tôi không thể tìm thấy bất kỳ tài liệu nào cho trường 'code_verifier' nhưng tôi đã phát hiện ra nếu bạn đặt nó thành các giá trị bằng nhau trong cả yêu cầu ủy quyền và mã thông báo, nó sẽ xóa lỗi này. Tôi không chắc giá trị dự định là gì hoặc nếu nó phải an toàn. Nó có một số độ dài tối thiểu (16 ký tự) nhưng tôi thấy cài đặt nullcũng hoạt động.

Tôi đang sử dụng AppAuth cho yêu cầu cấp phép trong ứng dụng khách Android có setCodeVerifier()chức năng.

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

Dưới đây là một ví dụ yêu cầu mã thông báo trong nút:

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);
  }
);

Tôi đã thử nghiệm và điều này hoạt động với cả https://www.googleapis.com/oauth2/v4/tokenhttps://accounts.google.com/o/oauth2/token.

Nếu bạn đang sử dụng GoogleAuthorizationCodeTokenRequestthay thế:

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

1

Đây là một câu trả lời ngớ ngẩn, nhưng vấn đề đối với tôi là tôi đã không nhận ra rằng tôi đã được cấp một mã thông báo oAuth hoạt động cho người dùng google của tôi mà tôi không thể lưu trữ. Giải pháp trong trường hợp này là vào bảng điều khiển api và đặt lại bí mật của máy khách.

Có rất nhiều câu trả lời khác về SO cho hiệu ứng này, ví dụ như Đặt lại bí mật của khách hàng OAuth2 - Khách hàng có cần cấp lại quyền truy cập không?


1

Bạn có thể phải xóa phản hồi OAuth cũ / không hợp lệ.

Tín dụng: mẫu node.js google oauth2 đã ngừng hoạt động không hợp lệ_grant

Lưu ý : Phản hồi OAuth cũng sẽ trở nên không hợp lệ nếu mật khẩu được sử dụng trong ủy quyền ban đầu đã bị thay đổi.

Nếu trong môi trường bash, bạn có thể sử dụng cách sau để xóa phản hồi cũ:

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


1

Có hai lý do chính cho invalid_grant lỗi mà bạn phải chăm sóc trước khi yêu cầu POST cho Refresh Token và truy cập Token.

  1. Tiêu đề yêu cầu phải chứa "loại nội dung: application / x-www-form-urlencoding"
  2. Tải trọng yêu cầu của bạn phải là url Dữ liệu biểu mẫu được mã hóa, không gửi dưới dạng đối tượng json.

RFC 6749 OAuth 2.0 định nghĩa invalid_grant như: Việc cấp cung cấp uỷ quyền (ví dụ, mã ủy quyền, thông tin chủ sở hữu tài nguyên) hoặc thẻ làm mới là không hợp lệ, hết hạn, thu hồi, không phù hợp với chuyển hướng URI được sử dụng trong các yêu cầu cấp phép, hoặc được ban hành cho khách hàng khác .

Tôi tìm thấy một bài viết tốt, ở đây bạn sẽ tìm thấy nhiều lý do khác cho lỗi này.

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


Ý của bạn là đăng hai câu trả lời gần giống nhau phải không? Bạn có thể muốn xóa cái này vì cái kia có một dòng bổ sung.
Blastfurnace


0

Sau khi xem xét và thử tất cả các cách khác ở đây, đây là cách tôi giải quyết vấn đề trong nodejs với googleapismô-đun kết hợp với requestmô-đun, mà tôi đã sử dụng để tìm nạp các mã thông báo thay vì getToken()phương thức được cung cấp :

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);
            }
        });

Tôi chỉ đơn giản sử dụng requestđể thực hiện yêu cầu api qua HTTP như được mô tả ở đây: https://developers.google.com/identity/prot Protocol / OuthuthWebServer # 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

Hãy thử thay đổi url của bạn để yêu cầu

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

0

Đối với những người tương lai ... Tôi đã đọc nhiều bài báo và blog nhưng đã gặp may mắn với giải pháp bên dưới ...

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();

Blog này mô tả các trường hợp khác nhau trong đó lỗi "không hợp lệ" xuất hiện.

Thưởng thức!!!


0

đối với tôi tôi phải chắc chắn rằng redirect_urilà một kết hợp chính xác với một trong các nhà phát triển giao diện điều khiển Authorised redirect URIs, mà cố định nó cho tôi, tôi đã có thể gỡ lỗi và biết chính xác những gì là vấn đề sau khi chuyển từ https://accounts.google.com/o/oauth2/tokenđếnhttps://www.googleapis.com/oauth2/v4/token

Tôi đã có một lỗi thích hợp:

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

0

Tôi gặp vấn đề này sau khi kích hoạt API dịch vụ mới trên bảng điều khiển Google và cố gắng sử dụng thông tin đăng nhập được tạo trước đó.

Để khắc phục vấn đề này, tôi đã phải đi trở lại trang chứng chỉ, nhấp vào tên chứng chỉ, và bấm vào "Save" một lần nữa . Sau đó, tôi có thể xác thực tốt.


0

Trong trường hợp của tôi, vấn đề là trong mã của tôi. Sai lầm là tôi đã cố gắng khởi tạo ứng dụng khách 2 lần với cùng một mã thông báo. Nếu không có câu trả lời nào ở trên giúp đảm bảo bạn không tạo ra 2 phiên bản của máy khách.

Mã của tôi trước khi sửa:

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)

ngay sau khi tôi thay đổi nó (chỉ sử dụng một ví dụ):

@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)

nó đã sửa các vấn đề của tôi với loại cấp.


0

Đối với tôi, vấn đề là tôi có nhiều khách hàng trong dự án của mình và tôi khá chắc chắn rằng điều này hoàn toàn ổn, nhưng tôi đã xóa tất cả các khách hàng cho dự án đó và tạo một khách hàng mới và tất cả bắt đầu làm việc cho tôi (Có ý tưởng này giúp đỡ plugin WP_SMTP diễn đàn hỗ trợ) Tôi không thể tìm ra liên kết đó để tham khảo


0

Nếu bạn đang vệ sinh đầu vào của người dùng (Ví dụ: $_GET["code"]bằng php) Hãy chắc chắn rằng bạn không vô tình thay thế một cái gì đó trong mã.

Hiện tại regex tôi đang sử dụng /[^A-Za-z0-9\/-]/


0

Hãy xem https://dev.to/risafj/beginner-s-guide-to-oauth-under Hiểu-access-tokens-and-Authorization-code-2988

Trước tiên, bạn cần có 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;

An toàn Mã thông báo truy cập và Mã thông báo làm mới và expire_in, trong Cơ sở dữ liệu. Mã thông báo truy cập hết hạn sau $ expires_in giây. Hơn bạn cần lấy Mã thông báo truy cập mới (và bảo vệ an toàn trong Cơ sở dữ liệu) với Yêu cầu sau:

$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;

Hãy ghi nhớ để thêm Tên miền redirect_uri vào Tên miền của bạn trong Bảng điều khiển Google: https://console.cloud.google.com/apis/credentials trong Tab "OAuth 2.0-ID khách hàng". Ở đó bạn cũng tìm thấy ID khách hàng và Bí mật khách hàng của mình.


0

Có một khoảng thời gian chờ không có giấy tờ giữa khi bạn lần đầu tiên chuyển hướng người dùng đến trang xác thực google (và lấy lại mã) và khi bạn lấy mã được trả lại và đăng nó vào url mã thông báo. Nó hoạt động tốt với tôi với client_id thực tế do google cung cấp, trái ngược với "địa chỉ email không có giấy tờ". Tôi chỉ cần bắt đầu lại quá trình.


0

Nếu bạn đang thử nghiệm điều này trong postman / mất ngủ và chỉ đang cố gắng để nó hoạt động, gợi ý: mã auth của máy chủ (tham số mã) chỉ tốt một lần. Có nghĩa là nếu bạn đưa ra bất kỳ tham số nào khác trong yêu cầu và nhận lại 400, bạn sẽ cần sử dụng mã xác thực máy chủ mới hoặc bạn sẽ chỉ nhận được 400 thông số khác.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.