thắc mắc Xin chỉ giáo Oauth2 trên mobile app

NickBiBaneCMNR.Ver2

Junior Member
Em code ReactJs, dạo này có ý tưởng và đá tí sang mobile app, dùng expo với react Native, backend e dùng NestJs. Phần đăng nhập e cho người dùng Login bằng google. Mà nghiên cứu vụ Oath2 trên mobile cứ bị thế nào ấy. Mô hình và flow của Oauth2 thì e hiểu là nó hoạt động như hình này​
Screenshot 2023-12-15 at 15.37.07.png
Ở đây có cả sự tham gia của backend và frontend để xác thực thằng người dùng đó, đến cuối của quy trình thì backend nó xác thực được với google rằng token này là valid và kèm theo email của nó, từ đó dùng để lôi resource ra trả về client. Cơ mà e tìm trên mạng bọn nó hướng dẫn "Login with google" trên mobile toàn là chỉ có câu chuyện của client (mobile app) nói chuyện với google (Oauth Server), kết chuyện của bọn nó là thằng Oauth Server trả về client được 1 cái token và info mà nó cho phép truy cập (Google.useAuthRequest({...}) hàm này để login), thế là xong. Em thắc mắc ở đây là ở bước 6 trên mô hình kia theo e được biết thì backend nó gửi token cùng với secretkey, id_app lên cho google để xác thực, nhưng trong các tutorial e xem thì ko thằng nào làm thế cả, và trong setting credentials của google app thì cả ios và android đều ko có thằng nào chìa secretkey ra cho mình. Xem các tutorial mà login trên web thì ok có secretkey, nhưng đối với mobile thì làm gì có secretkey mà thực hiện bước 6 kia :(
Các bác có kinh nghiệm thông não cho e với, ko có secretkey thì xác thực làm sao :(. e cảm ơn rất nhiều ạ :)
 
Tạo Oauth Google dành cho android với app thì google nó hiểu là chỉ có tầng client xài cụ thể là app android/IOS và không có sự tham gia của server nên không có client_secret. ( Chủ yếu để lấy email, profile ... ). Ví dụ: Dùng thông tin email của google đăng nhập vào hệ thống của mình và chỉ được gọi trực tiếp các api google trên tầng client.

Muốn server có token để gọi các api google dưới server thì tìm hiểu thêm "Server side access". Cụ thể là tạo thêm 1 web application OAuth
 
Last edited:
Tạo Oauth Google dành cho android với app thì google nó hiểu là chỉ có tầng client xài cụ thể là app android/IOS và không có sự tham gia của server nên không có client_secret. ( Chủ yếu để lấy email, profile ... ). Ví dụ: Dùng thông tin email của google đăng nhập vào hệ thống của mình và chỉ được gọi trực tiếp các api google trên tầng client.

Muốn server có token để gọi các api google dưới server thì tìm hiểu thêm "Server side access". Cụ thể là tạo thêm 1 web application OAuth
Oh, thế làm sao backend biết được token đó chính xác là của thằng người dùng đó hở bác ??
 
chỉ có câu chuyện của client (mobile app) nói chuyện với google (Oauth Server)
Cùng là của Google đâu có nghĩa nó là 1 đâu thím, Google đóng vai trò Identity Provider (IdP) nó khác với Google đóng vai trò Resource Server (mấy cái như YouTube API). Còn cái secret key trả về thì sai lè luôn, OAuth2 có nhiều authorization grant/flow, gửi client_id/client_secret chỉ là 1 cách, dùng authorization code là 1 flow khác, dùng username/password lại là 1 flow khác.

Phổ biến nhất vẫn là cái authorization code flow, tóm tắt thì nó có 2 bước, 1 là kêu user cấp quyền xong IdP trả về authorization code, 2 là lấy code đó đi đổi access token. Cái nó đưa về là access token, không phải secret key. "Key" là cái thím cần giữ để giao tiếp với bên còn lại (ví dụ SSH key, zip password), còn access token không xài nữa thì cứ vứt đi thôi không cần giữ.

thế làm sao backend biết được token đó chính xác là của thằng người dùng đó hở bác
Cái access token là 1 JWT, thím cứ decode ra lấy cái payload rồi nhìn trong field sub coi nó là ai. Tự lập mấy bảng thông tin users bên DB mình, xong lưu cái sub này vào để biết user nào tương ứng Google account nào là có thông tin để tìm thôi.
 
Last edited:
Google là 1 Identity provider, bác phải integrate google với OAuth server của bác, xong nếu bác xác nhận google đăng nhập thành công thì nó sẽ redirect về oauth server, và oauth server sẽ redirect bác về code + state theo
Mình quick draft cái flow như thế này, mình có tự build Identity server 3 4 cái gì rồi, vừa mới migrate lên Oauth cho 4tr users xong nên chắc vụ này mình ko sai đâu kaka.
Cái này nên làm chuẩn ngay từ đầu, nếu hiểu sai các khái niệm về id token, access token, Identity provider, scope, audience, issuer, client credential flow, authorization code flow ... các thứ thì rất tai hại, để lại shit cho ae hốt sml :D y như cái system hiện tại của cty mình, tụi nó implement kiểu gì mà có cả đống loại token
flow.png
 
Google là 1 Identity provider, bác phải integrate google với OAuth server của bác, xong nếu bác xác nhận google đăng nhập thành công thì nó sẽ redirect về oauth server, và oauth server sẽ redirect bác về code + state theo
Mình quick draft cái flow như thế này, mình có tự build Identity server 3 4 cái gì rồi, vừa mới migrate lên Oauth cho 4tr users xong nên chắc vụ này mình ko sai đâu kaka.
Cái này nên làm chuẩn ngay từ đầu, nếu hiểu sai các khái niệm về id token, access token, Identity provider, scope, audience, issuer, client credential flow, authorization code flow ... các thứ thì rất tai hại, để lại shit cho ae hốt sml :D y như cái system hiện tại của cty mình, tụi nó implement kiểu gì mà có cả đống loại token
View attachment 2241310
Alo bác ơi, cái đoạn download jwks kia thì thằng oauth server nó show api ra cho mình call hay sao ạ? Mô hình của bác dùng micoroservice thì phải, e chỉ làm đơn giản thôi, thằng google nó là auth server làm luôn
 
K cần thần thánh hóa tụi nó quá đâu. T từng mentor 1 thanh niên có giải ICPC với làm việc cùng với tụi chuyên CP đây. Đúng là IQ có cao nhưng k phải kiểu thần thánh gì đâu. Mình vẫn gõ đầu tụi nó bình thường, :ah:
Thường mỗi framework nó sẽ có library này, bác cần trỏ jwks uri tới auth server là được. Để generate access token thì cần 1 cái public key vào 1 cái private key, thì Jwks này là cái public key đó và được expose ra ngoài để verify signature nha
 
Thường mỗi framework nó sẽ có library này, bác cần trỏ jwks uri tới auth server là được. Để generate access token thì cần 1 cái public key vào 1 cái private key, thì Jwks này là cái public key đó và được expose ra ngoài để verify signature nha
Sao quote t ở thớt khác qua đây vậy? :beat_brick:
 
Sao quote t ở thớt khác qua đây vậy? :beat_brick:
Á đù lộn, sorry my fence :boss:
Alo bác ơi, cái đoạn download jwks kia thì thằng oauth server nó show api ra cho mình call hay sao ạ? Mô hình của bác dùng micoroservice thì phải, e chỉ làm đơn giản thôi, thằng google nó là auth server làm luôn
Thường mỗi framework nó sẽ có library này, bác cần trỏ jwks uri tới auth server là được. Để generate access token thì cần 1 cái public key vào 1 cái private key, thì Jwks này là cái public key đó và được expose ra ngoài để verify signature nha
 
Á đù lộn, sorry my fence :boss:

Thường mỗi framework nó sẽ có library này, bác cần trỏ jwks uri tới auth server là được. Để generate access token thì cần 1 cái public key vào 1 cái private key, thì Jwks này là cái public key đó và được expose ra ngoài để verify signature nha
Theo như e tìm hiểu thì đối với gg, sau khi backend nhận được token, sẽ cần bắn 1 api lên gg để xác minh cái token đó, việc này thay cho việc phải lôi jwks về trong mô hình của bác đúng ko ạ ?
 
Theo như e tìm hiểu thì đối với gg, sau khi backend nhận được token, sẽ cần bắn 1 api lên gg để xác minh cái token đó, việc này thay cho việc phải lôi jwks về trong mô hình của bác đúng ko ạ ?
Ý bác là 1 cái API tương tự thế này đúng ko? chính xác là như vậy, Google nó expose ra 1 API để làm việc verification, thay vì bác phải download jwks file về và tự verify.
Mình đoán là cách này sẽ có 1 cái benefit từ google, vì jwks file của google thường chứa rất nhiều public key, nên việc wrap nó qua 1 cái api tokeninfo sẽ dễ xử lí hơn cho google. Vì google sẽ phải xử lí caching, cdn các thứ nữa. Còn mechanism là như nhau theo auth2 protocol
 
Ý bác là 1 cái API tương tự thế này đúng ko? chính xác là như vậy, Google nó expose ra 1 API để làm việc verification, thay vì bác phải download jwks file về và tự verify.
Mình đoán là cách này sẽ có 1 cái benefit từ google, vì jwks file của google thường chứa rất nhiều public key, nên việc wrap nó qua 1 cái api tokeninfo sẽ dễ xử lí hơn cho google. Vì google sẽ phải xử lí caching, cdn các thứ nữa. Còn mechanism là như nhau theo auth2 protocol
Đấy, cái e muốn hỏi chính xác là cái này ạ, làm sao để resource server validate được token. Cảm ơn bác nhiều ạ, tối về impliment thôi :D
 
Back
Top