Saya terus mendapatkan invalid_grant
kesalahan saat mencoba mendapatkan token oAuth dari Google untuk terhubung ke api kontak mereka. Semua informasi benar dan saya telah memeriksa tiga kali lipat ini sehingga agak bingung.
Adakah yang tahu apa yang mungkin menyebabkan masalah ini? Saya telah mencoba mengatur id klien yang berbeda untuk itu tetapi saya mendapatkan hasil yang sama, saya telah mencoba menghubungkan banyak cara berbeda termasuk mencoba otentikasi paksa, tetapi tetap hasilnya sama.
google-api
André Figueira
sumber
sumber
Jawaban:
Saya mengalami masalah ini ketika saya tidak secara eksplisit meminta akses "offline" saat mengirim pengguna ke OAuth "Apakah Anda ingin memberi izin aplikasi ini untuk menyentuh barang-barang Anda?" halaman.
Pastikan Anda menentukan access_type = offline dalam permintaan Anda.
Detailnya ada di sini: https://developers.google.com/accounts/docs/OAuth2WebServer#offline
(Juga: Saya pikir Google menambahkan batasan ini pada akhir 2011. Jika Anda memiliki token lama sebelum itu, Anda harus mengarahkan pengguna Anda ke halaman izin untuk mengotorisasi penggunaan offline.)
sumber
access_type
untukoffline
, kesalahan ini masih terjadi.Saya mengalami masalah yang sama ini meskipun menentukan "offline"
access_type
dalam permintaan saya sesuai jawaban bonkydog. Singkat cerita, saya menemukan bahwa solusi yang dijelaskan di sini berhasil untuk saya:https://groups.google.com/forum/#!topic/google-analytics-data-export-api/4uNaJtquxCs
Intinya, ketika Anda menambahkan Klien OAuth2 di konsol Google API Anda, Google akan memberi Anda "ID Klien" dan "alamat Email" (dengan asumsi Anda memilih "webapp" sebagai jenis klien Anda). Dan terlepas dari konvensi penamaan Google yang menyesatkan, mereka mengharapkan Anda mengirimkan "Alamat email" sebagai nilai
client_id
parameter saat Anda mengakses API OAuth2 mereka.Ini berlaku saat memanggil kedua URL ini:
Perhatikan bahwa panggilan ke URL pertama akan berhasil jika Anda memanggilnya dengan "ID Klien", bukan "Alamat email" Anda. Namun menggunakan kode yang dikembalikan dari permintaan itu tidak akan berfungsi saat mencoba mendapatkan token pembawa dari URL kedua. Sebagai gantinya Anda akan mendapatkan pesan 'Error 400' dan "invalid_grant".
sumber
Meskipun ini adalah pertanyaan lama, sepertinya banyak yang masih mengalaminya - kami menghabiskan waktu berhari-hari untuk mencari tahu sendiri.
Dalam spesifikasi OAuth2, "invalid_grant" adalah semacam penampung-semua untuk semua kesalahan yang terkait dengan token yang tidak valid / kedaluwarsa / dicabut (pemberian autentikasi atau token penyegaran).
Bagi kami, masalahnya ada dua:
Pengguna telah secara aktif mencabut akses ke aplikasi kami.
Masuk akal, tetapi dapatkan ini: 12 jam setelah pencabutan, Google berhenti mengirim pesan kesalahan dalam tanggapan mereka:
“error_description” : “Token has been revoked.”
Ini agak menyesatkan karena Anda akan menganggap bahwa pesan kesalahan ada setiap saat yang sebenarnya tidak kasus. Anda dapat memeriksa apakah aplikasi Anda masih memiliki akses di halaman izin aplikasi .
Pengguna telah menyetel ulang / memulihkan sandi Google mereka
Pada bulan Desember 2015, Google mengubah perilaku default mereka sehingga penyetelan ulang sandi untuk pengguna non-Google Apps akan secara otomatis mencabut semua token penyegaran aplikasi pengguna. Saat pencabutan, pesan kesalahan mengikuti aturan yang sama seperti kasus sebelumnya, jadi Anda hanya akan mendapatkan "error_description" dalam 12 jam pertama. Sepertinya tidak ada cara untuk mengetahui apakah pengguna secara manual mencabut akses (sengaja) atau itu terjadi karena penyetelan ulang kata sandi (efek samping).
Selain itu, ada segudang penyebab potensial lain yang dapat memicu kesalahan:
Saya telah menulis artikel pendek yang merangkum setiap item dengan beberapa panduan debugging untuk membantu menemukan pelakunya. Semoga membantu.
sumber
Saya mengalami masalah yang sama. Bagi saya, saya memperbaikinya dengan menggunakan Alamat Email (string yang diakhiri dengan ... @ developer.gserviceaccount.com) daripada ID Klien untuk nilai parameter client_id. Penamaan yang ditetapkan oleh Google membingungkan di sini.
sumber
Masalah saya adalah saya menggunakan URL ini:
Kapan saya seharusnya menggunakan URL ini:
Ini sedang menguji akun layanan yang menginginkan akses offline ke mesin Penyimpanan .
sumber
Saya mendapat pesan kesalahan yang sama 'invalid_grant' dan itu karena authResult ['code'] yang dikirim dari javascript sisi klien tidak diterima dengan benar di server.
Cobalah untuk mengeluarkannya kembali dari server untuk melihat apakah itu benar dan bukan string kosong.
sumber
jika Anda menggunakan perpustakaan juru tulis, cukup atur mode offline, seperti yang disarankan bonkydog di sini adalah kodenya:
https://github.com/codolutions/scribe-java/
sumber
Menggunakan clientId Android (tidak ada client_secret) saya mendapatkan respon kesalahan berikut:
Saya tidak dapat menemukan dokumentasi apa pun untuk bidang 'code_verifier' tetapi saya menemukan jika Anda menyetelnya ke nilai yang sama di otorisasi dan permintaan token, itu akan menghapus kesalahan ini. Saya tidak yakin apa nilai yang dimaksudkan atau apakah itu harus aman. Ini memiliki beberapa panjang minimum (16? Karakter) tetapi saya menemukan pengaturan
null
juga berfungsi.Saya menggunakan AppAuth untuk permintaan otorisasi di klien Android saya yang memiliki
setCodeVerifier()
fungsi.Berikut adalah contoh permintaan token di node:
Saya menguji dan ini bekerja dengan
https://www.googleapis.com/oauth2/v4/token
danhttps://accounts.google.com/o/oauth2/token
.Jika Anda menggunakan
GoogleAuthorizationCodeTokenRequest
gantinya:sumber
Ini adalah jawaban yang konyol, tetapi masalah bagi saya adalah saya gagal menyadari bahwa saya telah mengeluarkan token oAuth aktif untuk pengguna Google saya yang gagal saya simpan. Solusi dalam kasus ini adalah pergi ke konsol api dan mengatur ulang rahasia klien.
Ada banyak jawaban lain tentang SO untuk efek ini misalnya Atur Ulang Rahasia Klien OAuth2 - Apakah klien perlu memberikan kembali akses?
sumber
Anda mungkin harus menghapus respons OAuth yang basi / tidak valid.
Kredit: sampel google oauth2 node.js berhenti berfungsi invalid_grant
Catatan : Tanggapan OAuth juga akan menjadi tidak valid jika sandi yang digunakan dalam otorisasi awal telah diubah.
Jika dalam lingkungan bash, Anda dapat menggunakan yang berikut ini untuk menghapus respons basi:
rm /Users/<username>/.credentials/<authorization.json>
sumber
Ada dua alasan utama untuk kesalahan invalid_grant yang harus Anda perhatikan sebelum permintaan POST untuk Refresh Token dan Access Token.
RFC 6749 OAuth 2.0 mendefinisikan invalid_grant sebagai: Pemberian otorisasi yang diberikan (misalnya, kode otorisasi, kredensial pemilik sumber daya) atau token penyegaran tidak valid, kedaluwarsa, dicabut, tidak cocok dengan URI pengalihan yang digunakan dalam permintaan otorisasi, atau diberikan ke klien lain .
Saya menemukan artikel bagus lainnya, di sini Anda akan menemukan banyak alasan lain untuk kesalahan ini.
https://blog.timekit.io/google-oauth-invalid-grant-nightmare-and-how-to-fix-it-9f4efaf1da35
sumber
Jika Anda mengujinya di tukang pos / insomnia dan hanya mencoba membuatnya berfungsi, petunjuk: kode auth server (parameter kode) hanya baik sekali. Artinya jika Anda memasukkan salah satu parameter lain dalam permintaan dan mendapatkan kembali 400, Anda harus menggunakan kode autentikasi server baru atau Anda hanya akan mendapatkan 400 lagi.
sumber
di konsol situs ini.developers.google.com
papan konsol ini pilih proyek Anda masukan url sumpah. url panggilan balik oauth akan dialihkan saat oauth berhasil
sumber
Setelah mempertimbangkan dan mencoba semua cara lain di sini, berikut ini cara saya menyelesaikan masalah di nodejs dengan
googleapis
modul yang berhubungan denganrequest
modul, yang saya gunakan untuk mengambil token alih-alihgetToken()
metode yang disediakan :Saya hanya menggunakan
request
untuk membuat permintaan api melalui HTTP seperti yang dijelaskan di sini: https://developers.google.com/identity/protocols/OAuth2WebServer#offlinesumber
Coba ubah url Anda untuk permintaan menjadi
sumber
Untuk orang-orang yang akan datang ... Saya membaca banyak artikel dan blog tetapi beruntung dengan solusi di bawah ini ...
Blog ini menggambarkan kasus berbeda di mana kesalahan "invalid_grant" muncul.
Nikmati!!!
sumber
bagi saya, saya harus memastikan bahwa
redirect_uri
itu sama persis dengan yang ada di konsol pengembangAuthorised redirect URIs
, yang memperbaikinya untuk saya, saya dapat men-debug dan tahu apa sebenarnya masalahnya setelah beralih darihttps://accounts.google.com/o/oauth2/token
kehttps://www.googleapis.com/oauth2/v4/token
Saya mendapat kesalahan yang tepat:
sumber
Saya mengalami masalah ini setelah mengaktifkan API layanan baru di konsol Google dan mencoba menggunakan kredensial yang dibuat sebelumnya.
Untuk memperbaiki masalah ini, saya harus kembali ke halaman kredensial, mengklik nama kredensial, dan mengklik "Simpan" lagi . Setelah itu, saya dapat mengautentikasi dengan baik.
sumber
Dalam kasus saya, masalahnya ada di kode saya. Secara keliru saya mencoba memulai klien 2 kali dengan token yang sama. Jika tidak ada jawaban di atas yang membantu memastikan Anda tidak membuat 2 contoh klien.
Kode saya sebelum perbaikan:
segera setelah saya mengubahnya menjadi (gunakan hanya satu contoh):
itu memperbaiki masalah saya dengan jenis hibah.
sumber
Bagi saya masalahnya adalah saya memiliki banyak klien dalam proyek saya dan saya cukup yakin ini baik-baik saja, tetapi saya menghapus semua klien untuk proyek itu dan membuat yang baru dan semua mulai bekerja untuk saya (Punya ide ini dari bantuan plugin WP_SMTP forum dukungan) Saya tidak dapat menemukan tautan itu untuk referensi
sumber
Jika Anda membersihkan masukan pengguna (Misalnya,
$_GET["code"]
di php) Pastikan Anda tidak mengganti sesuatu di kode secara tidak sengaja.Regex yang saya gunakan sekarang
/[^A-Za-z0-9\/-]/
sumber
Lihat https://dev.to/risafj/beginner-s-guide-to-oauth-understanding-access-tokens-and-authorization-codes-2988 ini
Pertama, Anda memerlukan access_token:
Amankan Access Token dan Refresh Token dan expire_in, di Database. Token Akses kedaluwarsa setelah $ expires_in detik. Maka Anda perlu mengambil Token Access baru (dan mengamankannya di Database) dengan Permintaan berikut:
Ingatlah untuk menambahkan Domain redirect_uri ke Domain Anda di Konsol Google: https://console.cloud.google.com/apis/credentials di Tab "OAuth 2.0-Client-IDs". Di sana Anda juga menemukan ID Klien dan Rahasia Klien Anda.
sumber
Ada waktu tunggu yang tidak terdokumentasi antara saat Anda pertama kali mengalihkan pengguna ke halaman otentikasi Google (dan mendapatkan kembali kode), dan saat Anda mengambil kode yang dikembalikan dan mempostingnya ke url token. Ini berfungsi dengan baik untuk saya dengan client_id yang sebenarnya disediakan oleh google sebagai lawan dari "alamat email tidak berdokumen". Saya hanya perlu memulai prosesnya lagi.
sumber