我读了太多的页面并尝试了抄写员示例,但我错过了最重要的一点 - oauth 身份验证的唯一且持久的用户 ID 是什么?
我想实现用户可以使用 Google、FB、Twitter 等登录的网站。我希望流程是:
- servlet 向选定的授权提供商请求请求 token
- servlet 构造授权 URL 并将用户重定向到那里
- 用户授予权限
- 授权服务重定向到回调并将验证程序作为参数传递
- 回调的 servlet 向授权提供者请求访问 token
现在我可以在提供商的 API 中使用此访问 token ,例如浏览 Google 云端硬盘或发布恶意推文。很好,但我想要的只是获得某种可以存储在数据库中的 ID,并将其与用户帐户关联起来。这样当用户下次来时,我就能认出他。
我不认为访问 token 是我想要的。我运行了抄写员示例,该值随着每次调用而变化。
我是否应该找到一些返回用户登录信息的提供商 API,并在用户每次登录时调用它?我不喜欢这个想法,因为(在我看来)这是每次登录的额外 HTTP 连接。例如,当我需要的只是几个字符时,谷歌驱动器示例将返回一堆数据。我认为我错过了一些重要的观点。还是真的是这样设计的?
最佳答案
token 是不透明的。它们不包含用户信息。在这种情况下,每个人都会做的是使用 [USER_ID
, ACCESS_TOKEN
] 保留一个单独的数据库,以便当用户登录时您可以获取其访问 token 。如果您登录多个服务,也许您还需要一个SERVICE_NAME
来将 twitter 与 google token 分开。
编辑
OAuth 不是一种身份验证或登录协议(protocol),它并不是这样设计的,尽管您可以通过临时扩展获取用户身份( Twitter 返回 user_id
在访问 token 响应上)或发出进一步的请求,这将始终是黑客攻击。
也许更适合您的需求的是 OpenID (不幸的是,抄写员不会在这里帮助你)
关于java - 使用 Scribe 构建 oauth 登录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21122979/