昨天我們寫好OAuthLogin
,並且註冊對應路由/ouath-login
,有了路由後我們就能補上我們之前在Google Cloud上暫時留空的重新導向URL了。
首先到env加上RedirectURL
,這邊就填上我們註冊好的/api/v1/ouath-login
。
接著我們回到Google Cloud,按到憑證找到我們當初建立的OAuth2.0用戶端
填上與env一樣的url,這樣就能讓google知道,認證成功後要去打我們昨天寫好的OAuthLogin
了
接著我們來產生google登入頁面的url,提供給使用者去google進行登入
首先我們回到callback.go,在SampleService
上多加一個條件來測試,當linebot輸入login時,我們一樣透過oauth2的config,來建立URL並回傳給使用者。
這邊要注意的是,我們透過帶入oauth2.AccessTypeOffline
來讓驗證過後會取得refresh token,透過refresh token我們可以在access token過期時取得新的token,而無需再次要求使用者進行授權。
但這只限於使用者第一次進行授權的時候才會拿的到,如果測試的時候需要再取得新的refresh token,要帶上oauth2.ApprovalForce
才能夠每次都再次進行授權和讓google發新的refresh token。
for _, event := range events {
if event.Type == linebot.EventTypeMessage {
switch message := event.Message.(type) {
case *linebot.TextMessage:
if message.Text == "login" {
config := &oauth2.Config{
ClientID: os.Getenv("ClientID"),
ClientSecret: os.Getenv("ClientSecret"), // from https://console.developers.google.com/project/<your-project-id>/apiui/credential
Endpoint: google.Endpoint,
Scopes: []string{drive.DriveScope},
RedirectURL: os.Getenv("RedirectURL"),
}
authURL := config.AuthCodeURL("state-token", oauth2.AccessTypeOffline) //oauth2.ApprovalForce
if _, err = app.LineBotClient.ReplyMessage(event.ReplyToken, linebot.NewTextMessage(authURL)).Do(); err != nil {
log.Println(err)
}
return
}
samplePK, err := app.SampleService.Sample(ctx, message.Text)
if err != nil {
log.Println(err)
return
}
if _, err = app.LineBotClient.ReplyMessage(event.ReplyToken, linebot.NewTextMessage(samplePK)).Do(); err != nil {
log.Println(err)
}
}
}
}
我們把程式跑起來後,可以看到linebot回覆了URL,點擊就可以進行登入囉~
由於我們在Google Cloud還是測試用的應用程式,所以登入後記得按旁邊的繼續
接著我們確認授權操作Google Drive
登入成功後,就可以看到OAuthLogin
回傳的HTML,同時後端終端機也會印出我drive上的資料名+ID。
這樣我們現在就能確定可以透過OAuth登入google然後操作drive了,那我們明天再見囉~