Saya ingin mendapatkan token akses dari Google. Google API mengatakan bahwa untuk mendapatkan token akses, kirim kode dan parameter lainnya ke halaman penghasil token, dan responsnya akan menjadi Objek JSON seperti:
{
"access_token" : "ya29.AHES6ZTtm7SuokEB-RGtbBty9IIlNiP9-eNMMQKtXdMP3sfjL1Fc",
"token_type" : "Bearer",
"expires_in" : 3600,
"refresh_token" : "1/HKSmLFXzqP0leUihZp2xUt3-5wkU7Gmu2Os_eBnzw74"
}
Namun, saya tidak menerima token penyegaran. Tanggapan dalam kasus saya adalah:
{
"access_token" : "ya29.sddsdsdsdsds_h9v_nF0IR7XcwDK8XFB2EbvtxmgvB-4oZ8oU",
"token_type" : "Bearer",
"expires_in" : 3600
}
gdata
gdata-api
access-token
Muhammad Usman
sumber
sumber
Jawaban:
Ini
refresh_token
hanya diberikan pada otorisasi pertama dari pengguna. Otorisasi berikutnya, seperti yang Anda buat saat menguji integrasi OAuth2, tidak akan mengembalikanrefresh_token
lagi. :)refresh_token
(asalkan itu juga termasuk parameter kueri 'access_type = offline'.Atau, Anda dapat menambahkan parameter kueri
prompt=consent&access_type=offline
ke pengalihan OAuth (lihat halaman OAuth 2.0 untuk Aplikasi Server Web ).Ini akan meminta pengguna untuk mengotorisasi aplikasi lagi dan akan selalu mengembalikan a
refresh_token
.sumber
access_type=offline
dalam semua kasus saat Anda menginginkannyarefresh_token
.$client->setAccessType('offline')
. Thefunction setApprovalPrompt()
sudah berlalu dalamforce
, secara default.Untuk mendapatkan token penyegaran, Anda harus menambahkan keduanya
approval_prompt=force
danaccess_type="offline"
Jika Anda menggunakan klien java yang disediakan oleh Google, ia akan terlihat seperti ini:sumber
Saya mencari malam yang panjang dan ini melakukan trik:
Pengguna-example.php yang dimodifikasi dari admin-sdk
kemudian Anda mendapatkan kode di url redirect dan otentikasi dengan kode dan mendapatkan token penyegaran
Anda harus menyimpannya sekarang;)
Saat akseskey Anda habis, lakukan saja
sumber
Ini telah menyebabkan saya kebingungan, jadi saya pikir saya akan membagikan apa yang saya pelajari dengan cara yang sulit:
Ketika Anda meminta akses menggunakan
access_type=offline
danapproval_prompt=force
parameter Anda harus menerima token akses dan token penyegaran . The akses Token berakhir segera setelah Anda menerimanya dan Anda akan perlu untuk menyegarkan itu.Anda dengan benar membuat permintaan untuk mendapatkan token akses baru dan menerima respons yang memiliki token akses baru Anda . Saya juga bingung dengan kenyataan bahwa saya tidak mendapatkan token penyegaran baru . Namun, beginilah seharusnya karena Anda dapat menggunakan token penyegaran yang sama berulang kali.
Saya pikir beberapa jawaban lain berasumsi bahwa Anda ingin mendapatkan token penyegaran baru untuk beberapa alasan dan menyarankan agar Anda mengotorisasi ulang pengguna, tetapi pada kenyataannya, Anda tidak perlu karena token penyegaran yang Anda miliki akan bekerja hingga dicabut oleh pengguna.
sumber
Jawaban Rich Sutton akhirnya berhasil untuk saya, setelah saya menyadari bahwa menambahkan
access_type=offline
dilakukan atas permintaan klien ujung depan untuk kode otorisasi, bukan permintaan ujung belakang yang menukar kode itu dengan access_token. Saya telah menambahkan komentar untuk jawabannya dan tautan ini di Google untuk info lebih lanjut tentang token yang menyegarkan.PS Jika Anda menggunakan Satellizer, berikut adalah cara menambahkan opsi itu ke $ authProvider.google di AngularJS .
sumber
Untuk mendapatkan
refresh_token
Anda perlu memasukkanaccess_type=offline
dalam URL permintaan OAuth. Saat pengguna mengautentikasi untuk pertama kali, Anda akan mendapatkan non-nilrefresh_token
danaccess_token
yang kedaluwarsa.Jika Anda memiliki situasi di mana pengguna mungkin mengautentikasi ulang akun yang sudah memiliki token otentikasi untuk Anda (seperti @SsjCosty menyebutkan di atas), Anda perlu mendapatkan kembali informasi dari Google di mana akun itu digunakan untuk tujuan tersebut. Untuk melakukan itu, tambahkan
profile
ke lingkup Anda. Menggunakan permata OAuth2 Ruby, permintaan terakhir Anda mungkin terlihat seperti ini:Perhatikan bahwa ruang lingkup memiliki dua entri terbatas-ruang, satu untuk akses hanya-baca ke Google Analytics, dan lainnya hanya
profile
, yang merupakan standar OpenID Connect.Ini akan menghasilkan Google menyediakan atribut tambahan yang disebut
id_token
dalamget_token
respons. Untuk mendapatkan informasi dari id_token, periksa halaman ini di Google docs. Ada beberapa perpustakaan yang disediakan Google yang akan memvalidasi dan "mendekode" ini untuk Anda (saya menggunakan permata google-id-token Ruby ). Setelah Anda diuraikan,sub
parameternya adalah ID akun Google yang unik.Patut dicatat, jika Anda mengubah cakupan, Anda akan mendapatkan kembali token penyegaran lagi untuk pengguna yang telah diautentikasi dengan cakupan asli. Ini berguna jika, katakanlah, Anda sudah memiliki banyak pengguna dan tidak ingin membuat mereka semua menghapus aplikasi di Google.
Oh, dan satu catatan terakhir: Anda tidak perlu
prompt=select_account
, tetapi berguna jika Anda memiliki situasi di mana pengguna Anda mungkin ingin mengautentikasi dengan lebih dari satu akun Google (yaitu, Anda tidak menggunakan ini untuk masuk / otentikasi) .sumber
1. Bagaimana cara mendapatkan 'refresh_token'?
Solusi: opsi access_type = 'offline' harus digunakan ketika membuat authURL. sumber: Menggunakan OAuth 2.0 untuk Aplikasi Server Web
2. Tetapi bahkan dengan 'access_type = offline', saya tidak mendapatkan 'refresh_token'?
Solusi: Harap dicatat bahwa Anda akan mendapatkannya hanya pada permintaan pertama, jadi jika Anda menyimpannya di suatu tempat dan ada ketentuan untuk menimpa ini dalam kode Anda ketika mendapatkan access_token baru setelah kedaluwarsa sebelumnya, maka pastikan untuk tidak menimpa nilai ini.
Dari Google Auth Doc: (nilai ini = access_type)
Jika Anda perlu 'refresh_token' lagi, maka Anda perlu menghapus akses untuk aplikasi Anda dengan mengikuti langkah-langkah yang ditulis dalam jawaban Rich Sutton .
sumber
Pengaturan ini akan menyebabkan token penyegaran dikirim setiap kali:
contoh diberikan di bawah ini (php):
sumber
Bagi saya, saya mencoba
CalendarSampleServlet
menyediakan oleh Google. Setelah 1 jam, access_key habis dan ada pengalihan ke halaman 401. Saya mencoba semua opsi di atas tetapi tidak berhasil. Akhirnya setelah memeriksa kode sumber untuk 'AbstractAuthorizationCodeServlet' , saya bisa melihat bahwa pengalihan akan dinonaktifkan jika ada kredensial, tetapi idealnya harus diperiksarefresh token!=null
. Saya menambahkan kode di bawah iniCalendarSampleServlet
dan berhasil setelah itu. Sangat lega setelah frustrasi selama berjam-jam. Terima kasih Tuhan.sumber
sekarang google telah menolak parameter-parameter dalam permintaan saya (access_type, prompt) ... :( dan tidak ada tombol "Cabut Akses" sama sekali. Saya frustasi karena mendapatkan kembali lol refresh_token saya
UPDATE: Saya menemukan jawabannya di sini: D Anda dapat memperoleh kembali token penyegaran dengan permintaan https://developers.google.com/identity/protocols/OAuth2WebServer
sumber
sumber
Menggunakan akses offline dan prompt: persetujuan bekerja dengan baik untuk saya:
sumber
Solusi saya agak aneh..saya mencoba setiap solusi yang saya temukan di internet dan tidak ada. Anehnya ini berhasil: hapus kredensial.json, segarkan, vinculate aplikasi Anda di akun lagi. File credentials.json baru akan memiliki token penyegaran. Cadangkan file ini di suatu tempat. Kemudian tetap gunakan aplikasi Anda sampai kesalahan token penyegaran kembali. Hapus file crendetials.json yang sekarang hanya dengan pesan kesalahan (ini terjadi dalam kasus saya), lalu tempelkan file kredensial lama Anda di folder, selesai! Sudah 1 minggu sejak saya melakukan ini dan tidak punya masalah lagi.
sumber
Untuk mendapatkan refresh_token baru setiap kali pada otentikasi, tipe kredensial OAuth 2.0 yang dibuat di dasbor harus "Lainnya". Juga seperti yang disebutkan di atas opsi access_type = 'offline' harus digunakan ketika membuat authURL.
Saat menggunakan kredensial dengan jenis "Aplikasi Web" tidak ada kombinasi variabel prompt / approval_prompt akan bekerja - Anda masih akan mendapatkan refresh_token hanya pada permintaan pertama.
sumber