2018年9月19日 星期三

2018-09-19 Google Oauth v2 Scope 的坑!

      今天有一個客戶發現 Google 不能登入系統,都會登入失敗,請同事去看,是否因為更新了什麼導致的,因為事情緊急,我也幫忙處理問題...

危機處理:

客戶:為什麼不能用了,不能登入我們要怎麼作業 OOXX.
PM:好的我們馬上處理 <=聯絡工程師,並且安撫客戶
RD:我什麼都沒動欸,為什麼突然不能用了,前幾天還好好的,生氣氣!
DevOps:我來幫你看看,除錯的過程中...
PM:我也來幫忙找原因為什麼不能用,另外一個系統的 Google oauth 也不能用了
RD:什麼?難道是同一個問題!
PM:你們快點找出問題,我來跟客戶說先用帳號密碼登入,這是 Google 的問題,我們也是受害者,需要時間修復
DevOps:我發現你們用的 Oauth App ID的帳號他說今天到期,會是沒有繳錢被停用了嗎?
PM:我打電話去問 Google 客服,幹!客服説我們是免費帳戶,不提供技術支援,但是歡迎在上面留言!還是我們換一組 Oauth App ID
DevOps:替換到 Oauth App ID 之後,還是一樣的問題,初步排除 Oauth App ID 問題,還是用官方範例的插件重寫試試看 .
RD:我先回去寫原本的程式,比較不會讓費時間
PM:好的
DevOps:我使用官方插件還是一樣遇到一樣的問題,改回原來的寫法,網路搜尋也沒什麼人遇到這個問題,太奇怪了!再重寫的過程中發現 redirect_url 怪怪的後面的帶了不必要的參數,另外 scope 改用官方範例的寫,發現錯誤提示不一樣了,好像是 redirect_url 和 scope 問題,在測試一下發現可以正常使用了,太神奇了!
PM:那趕快更新系統,看系統可不可以正常運作了
RD:更新完了可以正常運作!
PM:還好不用加班解決這個問題了!
DevOps、RD、PM 我們一致認為是 Google 害了我們
DevOps:我發現晚上在記錄問題的時候,又重新測試了一次發現是redirect_url 變嚴格了,不是 Scope 的問題,我們誤會 Google 修改了 scope profile 的權限了!

Oauth 架構如下圖:

Your application sends a token request to the Google Authorization Server, receives an authorization code,
exchanges the code for a token, and uses the token to call a Google API endpoint.



四步驟:

1.  使用者點選 Google Login 按鈕,會導入 Google 登入畫面
  Scope=profile%20email&
https://accounts.google.com/o/oauth2/v2/auth?
 client_id=424911365001.apps.googleusercontent.com&
 response_type=code&
 scope=openid%20email&
 redirect_uri=https://oauth2-login-demo.example.com/code&
2. 使用者登入Google Account 後,會呼叫後端的Callback url,並且取得 code
3. 拿使用者 code 去 Google API 取得 Token
POST /oauth2/v4/token HTTP/1.1
Host: www.googleapis.com
Content-Type: application/x-www-form-urlencoded

code=4/P7q7W91a-oMsCeLvIaQm6bTrgtp7&
client_id=8819981768.apps.googleusercontent.com&
client_secret={client_secret}&
redirect_uri=https://oauth2-login-demo.example.com/code&
grant_type=authorization_code
4. 拿到使用者 Token 再去讀取使用者資料

問題:

我發現問題出在第三步驟,會回傳 400 錯誤
'{
  "error": "invalid_grant",
  "error_description": "Bad Request"
}'
,更換了Oauth API 的 App ID 和 App Secret,但時一樣會遇到 Bad request 問題,
後來更換了兩個地方,
一個是 redirect_url 和 scpe(openid、email)
發現可以正常拿到值了,太棒了,我們都以為是 google 偷偷改了 oauth scope 才會讓 profile 不能用了,正當我們很開心解決的問題,以為沒事了...但是當我想說來記錄一下今天的問題,重新測試了一次,發現 profile 又可以用了,太神奇了傑克,反覆測試之後發現原來是 redirect_url 的問題,不知道為什麼redirect_url 檢查變嚴格了,整件事情峰迴路轉啊!

參考:
Using OAuth 2.0 to Access Google APIs
OpenID Connect


沒有留言:

張貼留言

台灣人工智慧學校第四屆開學典禮

台灣人工智慧學校  第四屆 開學典禮       今天 AI 學校開學,非常特別像參加研討會一樣,開場介紹孔祥重校長和陳昇瑋執行長為什麼會創建這間學校,主要是他們發現AI技術可以幫助產業界解決很多問題,但是人才問題嚴重,希望透過一年三期每期500左右的規模並在北中南都有分校,來...