手机端 OAuth2 认证

2022-07-25 14:47:16 +08:00
 qfdk

最近思考了一个问题,手机端如何保存 client_secret 的最佳实践 ?

事情是这样的,经过了一年的业务升级迁移,node 做的 gateway 已经逐渐稳定,oauth2 也用 node 写了一个,为了搞明白原理而已。https://www.v2ex.com/t/731916

用户认证 是通过 gateway 的,为了避免用户直接拿到 token ,我把 token 放在了 session 里面,这样用户么有明文 token 来请求接口了。

现在突然想到,如果是手机端如何处理呢?如果是 用 OAuth2 会发送 client_secre 来换取 AT 。再通过 AT 来请求后端接口获取数据,看了几个 flutter 的例子,client_secret 都是本地储存,因为手机端我认为不被信任,因为可以通过各种手段来获取到 client_secret

搜到的资源如下 :

有个叫做 PKCE 的东西 OAuth2 协议的扩展版本是支持的,这里是产生动态随机码,跳过了 client_secret 要保存在客户端的问题。

但是如果授权服务器不支持 PKCE 的情况下有没有什么最佳实践呢 ?

1610 次点击
所在节点    程序员
9 条回复
dzdh
2022-07-25 14:51:52 +08:00
看了一下 PKCE 是防止被拦截请求。本质上仍然需要一个 CODE 在本地。否则你调用接口的凭据是什么呢。
qfdk
2022-07-25 14:59:59 +08:00
@dzdh #1 code_verifier 是随机的,等于是 需要一个 code + code_verifier 来换取 token ,成本增加了一点点。
所以现在找个最佳实践来解惑,看到好多是保存在本地的例子
unco020511
2022-07-25 16:02:14 +08:00
你都 https 了,第三方怎么获取你的 token 呢?用户自身拿到 token(比如抓包)那很正常啊
xianzhe
2022-07-25 19:24:09 +08:00
@qfdk PKCE 目的就是解决你这个问题,但是你说不支持 PKCE 那就很搞了
xiangyuecn
2022-07-25 20:15:55 +08:00
严禁掩耳盗铃🐶
qfdk
2022-07-26 01:21:03 +08:00
@xianzhe #4 是吧,看来木有好法子了
qfdk
2022-07-26 14:41:09 +08:00
@xiangyuecn #5 啊啊啊啊,虽然很星象,但是也是我思考的问题 在 PKCE 出来之前那都是如何解决的呢
nyxsonsleep
2022-07-26 17:49:52 +08:00
没细看,不过你不像让用户不知道 token 是什么是不可能的。本地的东西怎么可能不让用户不知道数据是多少。
---
看法是要么加盐,还要可逆。这样使得用户每次的 token 都会发生变化。s 端还能解密回来知道 token 真实值。再每隔一个周期重新生成 token 。
以上简称为“算法”,也就是 app 与 s 端通讯的签名。
事实上无论哪家的算法都有被破过,但是不是永远被破。
因为破解这玩意是有成本的,比如算法放在 so 里,手机里装 xp 然后慢慢 hook 。虚拟机 dump 吧。汇编慢慢看,这得花多少时间,你的 app 值这个时间吗?
谁有这个闲心每个版本都破一遍?换个算法对于作者什么成本,破解者什么成本?
《没有绝对安全的系统》
qfdk
2022-07-26 19:33:04 +08:00
@nyxsonsleep #8 感谢回复,其实是这样的,我的业务对象是面相高校的,学校有专门的安全专业,在来之前他们的 token 是裸露的,导致很多学校拿着 token 进行“非法请求”、后来经过改进 加了谷歌验证码 还有 token 非直接留给客户端就少了很多 奇怪的请求。 我们手机业务是外包给第三方的,我在思考如果让我做一个手机 app 我应该如何处理。
您说的对没有绝对的安全,但是对于这些“闲”学生还是要斗智斗勇的。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/868548

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX