OAuth是一个关于授权(authorization)的开放网络标准,在全世界得到广泛应用。
我们希望您开发一个后端服务,实现(类似)OAuth2的功能,并提供API文档供合作者(前端和第三方)使用。
简单来说,OAuth避免了用户向第三方服务直接提供重要凭据(如密码),提供了一个安全的方式来授权第三方读取或修改信息。
我们要求您的解答实现以下全部功能。
同时,服务须能拦截常见非法请求,不能因不合法的输入影响正常用户。
完成编程后,简要谈谈从此题目中有什么收获/感想/吐槽,可以从题目的角度谈,也可以从学习时所用的资料、对后端技术(包括但不限于编程语言、数据库、Linux系统等)的看法等角度谈。如果时间紧迫,您也可以选择在二面现场再与面试官交流。
提供一个API,上传用户名、密码(哈希后)即可注册用户。
除了注册,所有检验用户密码的操作都必须利用时间戳、随机数进行哈希加密。
您需要设计具体的验证机制并提供文档。
为了保证用户授权页面的权威性,理论上第三方接入您的后端必须先行报备,定义其回调url、名称、图标、可能的授权范围等信息。
为简化问题,我们对报备功能不做要求。但您须预置至少两个不同的第三方(回调url不同,名称等字段不做要求)。
客户端提供第三方的标识符(在报备后提供的常量,您可自行定义)、请求授权范围,同时用户使用您定义的验密机制进行身份验证。
验证通过后,您需要为第三方提供一个可以代用户访问资源的token(格式、更新机制可自定,但需要为第三方提供使用文档)。
如成功,需按OAuth2规范正确返回重定向请求,且能向第三方服务提供相关的访问凭据。
第三方可以使用您定义的凭据,访问用户的某些信息。
我们要求第三方可在被授权范围内访问查询至少两种用户数据(如用户名、注册时间),授权范围也需有不少于两种。
用户验证身份后可以一次性撤回对指定第三方的全部授权。
- 不得使用直接实现OAuth功能或直接实现加盐验密的库。但对于哈希、对称/非对称加密算法,推荐使用语言原生的API(如有),避免自己实现。
- 用户、第三方、授权关系等信息必须持久化储存。即,重启您的后端服务或是服务器都不应丢失这些信息。
- 您可以使用任何您熟悉的语言答题(只要它能够在常见服务器上运行),但如果您没有后端经验,我们推荐您优先学习Go语言。
- 编写适当的文档是本题的重要部分。我们不做格式要求。您的文档应面向合作者(包括前端团队、第三方开发者)。
- 使用任一关系型或非关系型数据库。
- 除了提供后端代码外,说明(可提供脚本)如何将您的后端服务部署到一台全新的Ubuntu 22.04服务器上。
- 在某一环节试用JWT(JSON Web Token),或根据其思想实现类似的机制。