﻿# 如何讓 Google 的 OAuth 2.0 發出 Refresh Token

由於每一家不同的 OAuth 2.0 Provider 對於 Refresh Token 的核發方法都不盡相同，這篇文章我打算記錄一下 Google OAuth 2.0 發出 Refresh Token 的方法。

當我們進行 OAuth 2.0 的 Authorization Code Grant Type Flow 授權碼流程時，第一個步驟是將使用者導向到 Authorization Server 的 Auth Endpoint，預設你會需要以下參數：

-   `response_type`\=`code`
-   `client_id`
-   `state`
-   `scope`
-   `redirect_uri`

如果要透過 Google OAuth 2.0 發出 Refresh Token 的話，必須額外加上這個參數：

-   `access_type`\=`offline`

不過你必須注意，只有在你第一次發出授權請求的時候，從 Token Endpoint 得到的回應中才會看到 `refresh_token` 的資料。當你已經授權過了之後，預設並不會出現 Consent 頁面(也就是使用者授權的同意頁面)，只要不會出現 Consent 頁面，最終的結果就不會再次出現 `refresh_token` 資料！

正常來說，我們並不需要每次授權都取得 Refresh Token，因為 Refresh Token 正常應該在第一次取得時就先保存下來，供日後刷新時使用。

但如果你真的一定要再次取得 Refresh Token 的話，那就要在 Auth Endpoint 呼叫時再加上一個參數：

-   `prompt`\=`consent`

如此一來就可以讓 Token Endpoint 回應時取得 `refresh_token` 資料！👍

### Postman 的 Authorization 進階設定

新版的 Postman 提供了一個可以擴充 Auth Endpoint 呼叫時的參數，你可以參考下圖開啟 Authorization 的進階設定：

![Postman 的 Authorization 進階設定](https://stwillblogassets.blob.core.windows.net/files/images/external/stwillblogassets.blob.core.windows.net/82e2ee66cc423cf7c9ca-89199c1e-b2eb-4a5e-921e-dec43aed3e49.webp)

找到 Auth Request 區段，加入 `access_type`\=`offline` 與 `prompt`\=`consent` 這兩個參數即可：

![Auth Request](https://stwillblogassets.blob.core.windows.net/files/images/external/stwillblogassets.blob.core.windows.net/c4d02ddbb58206ec5365-15cf5347-dbf5-4a88-93fb-17f9f644aadd.webp)

### 相關連結

-   [Using OAuth 2.0 for Web Server Applications  |  Authorization  |  Google for Developers](https://developers.google.com/identity/protocols/oauth2/web-server#offline)
-   [Get refresh token google api - Stack Overflow](https://stackoverflow.com/a/8942732/910074)
