第三方登入系列文章的第三篇,在 ASP.NET Core 整合 Google 做第三方登入,Google 就無需再多做介紹了,全世界最大的搜尋引擎,也是數一數二的綜合網路服務供應商,光 Gmail 就有超過 18 億的使用者,這篇文章記錄了與 Google 整合第三方登入的過程。
其他的第三方登入解決方案可以參考下面的連結:
- 在 ASP.NET Core 整合 LINE Login 做為網站的第三方登入
- 在 ASP.NET Core 整合 Facebook 做為網站的第三方登入
- 在 ASP.NET Core 整合 Microsoft 做為網站的第三方登入
- 在 ASP.NET Core 整合 GitHub 做為網站的第三方登入
- 在 ASP.NET Core 整合 Twitter 做為網站的第三方登入
新增專案
這個步驟不是必要的,假如我們在 Google Cloud 已經有合適的專案,可以跳過這個步驟,沒有的話,我們到 Google Cloud 的後台新增一個專案。


然後,新增完成後,記得切換到剛剛新增的專案。

註冊應用程式
使用 OAuth 2.0 整合第三方登入,一定得先讓平台認識我們的應用程式,第一步我們先來註冊我們的應用程式,在漢堡選單中點選「OAuth 同意畫面
」,從這裡去註冊應用程式。

接著,選擇應用程式的使用者類型,如果應用程式是專屬於機構內部人員使用,可以選擇「內部
」,而我這邊是要開放給外部使用者使用的,因此選擇「外部
」。

下面就進入了註冊流程,第一個畫面是「OAuth 同意畫面
」,把必填欄位填一填之後,點擊「儲存並繼續
」。

第二個畫面是「範圍
」,這裡我們先不輸入任何資料,點擊「儲存並繼續
」。

第三個畫面是「測試使用者
」,應用程式在開發期間只有測試名單內的使用者才能存取,所以這邊我們需要指定測試使用者,都輸入完後,點擊「儲存並繼續
」,到這邊應用程式就註冊成功了。

建立 OAuth 2.0 用戶端 ID
Google 的玩法是一個專案只能有一個應用程式,要多個應用程式的話就建多個專案,但是一個應用程式可以有多個 OAuth 2.0 用戶端 ID
,給不一樣的授權流程使用,接下來,我們就要來請 Google 發給我們一個 OAuth 2.0 的用戶端 ID,點擊左邊選單內的「憑證
」。

接著,點擊「建立憑證
」,選擇「OAuth 用戶端 ID
」。

下面這邊「應用程式類型
」選擇「網頁應用程式
」,就會跳出來相應的欄位,將必填的欄位填一填之後,點擊「建立
」。
其中「已授權的重新導向 URI
」,雖然我們還沒開發好,但是這個網址如果已經知道了,可以先填進去,省得之後再回頭來修改。

當我們看到下面這個畫面之後,OAuth 2.0 用戶端 ID 就算是建立成功了,將「您的用戶端 ID
」及「您的用戶端密碼
」複製下來備用。

準備已授權的重新導向 URI
我們要進入到程式開發的環節了,先開發 Redirect URI,Google 會在使用者完成授權的時候,將 code
丟回給我們,屆時我們再拿 code 發一個 POST 去跟 Google 交換 Access Token
及 IdToken
,所需要參數如下:
AccessTokenUrl
:https://oauth2.googleapis.com/tokengrant_type
:填入 "authorization_code"code
:即我們拿到的 coderedirect_uri
:即 Redirect URIclient_id
:即用戶端編號client_secret
:即用戶端密碼
Redirect URI 的程式碼如下:
[HttpGet("callback")]
public async Task<IActionResult> Callback()
{
if (!this.Request.Query.TryGetValue("code", out var code))
{
return this.StatusCode(400);
}
var (accessToken, idToken) = await this.ExchangeAccessToken(code);
if (accessToken == null)
{
return this.StatusCode(400);
}
// TODO: Save AccessToken and IdToken
// TODO: User Login
return this.Redirect("/");
}
private async Task<(string, string)> ExchangeAccessToken(string code)
{
var client = this.httpClientFactory.CreateClient();
var request = new HttpRequestMessage(HttpMethod.Post, "AccessTokenUrl");
request.Content = new FormUrlEncodedContent(
new Dictionary<string, string>
{
["grant_type"] = "authorization_code",
["code"] = code,
["redirect_uri"] = "RedirectURI",
["client_id"] = "ClientId",
["client_secret"] = "ClientSecret"
});
var response = await client.SendAsync(request);
if (response.StatusCode != HttpStatusCode.OK) return (null, null);
var content = await response.Content.ReadAsStringAsync();
var result = JsonNode.Parse(content);
return (result["access_token"].GetValue<string>(), result["id_token"].GetValue<string>());
}
授權網址
接下來我們要來兜授權網址
,使用者點擊授權網址之後,就開始登入的流程,Google 的授權網址是 https://accounts.google.com/o/oauth2/v2/auth
,所需參數如下:
response_type
:填入 "code"client_id
:即用戶端編號redirect_uri
:即 Redirect URLstate
:隨機產生的一段唯一的字串,主要是可以用來避免 CSRF(Cross Site Request Forgery)。scope
:想請使用者授權給我們的資料範圍
由上述參數所兜出來的網址如下:
整個登入的流程如下圖:

當使用者瀏覽授權網址之後,就會導到 Google 的登入授權畫面,授權成功後,進到我們系統,拿到使用者資料就算是整合成功了。


以上,使用 ASP.NET Core 整合 Google 做第三方登入的步驟,就分享給大家,希望大家都能夠整合順利。
參考資料
- 為網路應用程式應用程式使用 OAuth 2.0 | Authorization | Google Developers
- Google API 的 OAuth 2.0 範圍 | Authorization | Google Developers
- OpenID Connect | Authentication | Google Developers