iT邦幫忙

1

google 等第三方登入前端+後端驗證

Zaku 2019-08-26 15:57:151935 瀏覽

在前後端分離的情況下,前端載load各大平台的script後,可以取的使用者是否已經登入google,若已登入在授權後可以取得使用著資料,在將資料打到後台,但後臺要怎麼驗證這個打過來的邀請?

簡單來說前台有個平台的script在驗證登入狀態,但後端該如何驗這個query是有經過前端驗證過的?

0
dragonH
iT邦超人 5 級 ‧ 2019-08-26 20:35:41
最佳解答

google 為例

他會回傳一個簽名過的 id token

然後你再用 public key 去驗證

這個理論上是無法偽造的

所以用 public key 驗證完後

你可以 100% 信任他是 google 送過來的

基本上大多數的 api 應該都有類似的東西

你可以往 各個 api 的 security 去找相關的功能


補充一下

後端該如何驗這個query是有經過前端驗證過的?

理論上你要把它當成完全沒驗證過的

因為你不應該相信任何前端來的資料

送過來的資料也不一定有經過你的前端

所以任何需要驗證的機敏資料都應該在後端再次驗證

看更多先前的回應...收起先前的回應...
Zaku iT邦新手 3 級 ‧ 2019-08-27 09:58:56 檢舉

恩恩所以我的問題是怎麼去驗證後端收到的query,不單指前端送來的。
google為例,是有給token,但她的public key是?要怎麼拿到相應的?要如何去驗證?

dragonH iT邦超人 5 級 ‧ 2019-08-27 10:01:34 檢舉

內文有說怎麼驗證唷

他的 SDK 有提供

const {OAuth2Client} = require('google-auth-library');
const client = new OAuth2Client(CLIENT_ID);
async function verify() {
  const ticket = await client.verifyIdToken({
      idToken: token,
      audience: CLIENT_ID,  // Specify the CLIENT_ID of the app that accesses the backend
      // Or, if multiple clients access the backend:
      //[CLIENT_ID_1, CLIENT_ID_2, CLIENT_ID_3]
  });
  const payload = ticket.getPayload();
  const userid = payload['sub'];
  // If request specified a G Suite domain:
  //const domain = payload['hd'];
}
verify().catch(console.error);
Zaku iT邦新手 3 級 ‧ 2019-08-27 13:23:27 檢舉

大大看的是哪一份文件,用的是:https://github.com/googleapis/google-auth-library-nodejs 這個吧,其他平台像fb等等也提供類似的方式?

dragonH iT邦超人 5 級 ‧ 2019-08-27 13:37:18 檢舉

我是看官方doc

連結一開始就有貼唷

fb 的話

他們一整篇再說安全性的東西

另一個參考

基本上你喊得出來的平台 api

應該都有類似的東西

Zaku iT邦新手 3 級 ‧ 2019-08-27 15:08:42 檢舉

感謝大大我摸一下

dragonH iT邦超人 5 級 ‧ 2019-08-27 15:15:29 檢舉

感謝大大我摸一下

好像哪裡怪怪的 /images/emoticon/emoticon25.gif

Zaku iT邦新手 3 級 ‧ 2019-08-27 15:30:02 檢舉

(摸)(摸)(摸)

0
小魚
iT邦大師 1 級 ‧ 2019-08-26 16:37:07

他會回傳資料給你,
就知道是驗證過的,
剩下的部分就是自己處理了.

P.S. 題外話, 千端是什麼, 請問有萬端嗎? XD

Zaku iT邦新手 3 級 ‧ 2019-08-26 17:16:53 檢舉

改了科科。
驗證後是給前端,但別人偽造一份丟到後端,後端不知怎麼分辨。

0
浩瀚星空
iT邦超人 1 級 ‧ 2019-08-27 00:45:46

正常來說,不太可能有辦法偽造id token
因為認真來說,token是由google生成的一種身份証明的編碼。

任何人都不太可能可以取到其它人。如果真的害怕前端容易被人看到的話。
我記得google也有提供php或是java的sdk處理方式。

經過後端來處理也會比較安全。

正常來說,經由前端登入驗証過後token。你後端只需要比對是否有其token再做登入的動作就好。
如果怕危險的話。你可以將其認証的程式碼多一個本機運行確定的動作就好了。
這樣就不用擔心別人用外連的方式來強暴式登入。

Zaku iT邦新手 3 級 ‧ 2019-08-27 10:00:36 檢舉

目前不知道怎麼驗證這個token,無從比對起。像可能有重複登入,第一次登入等等。

我覺得你沒搞懂第三方登入的原理。我大約說一下流程

1.先跟google請求登入情況,這個登入情況指的是會員是否有登入了google。這時候其實你的站還不算登入。token值是有登入了才會回傳。

2.依照上一步取到的token來處理。先檢查你自已的站,有無符合該token的user。沒有符合就依照google的其它額外資料生成一個user。
有符合就依其user資料來做登入。

所以,你說的什麼第一次登入,重覆登入。完全沒這回事。你的站要處理的只是與google連動的特性而已。
但主體還是你自已的站。google只是多了一層驗証。

我要發表回答

立即登入回答