应用场景1OAuth 2.0的一些问题刨根问底协议Contents应用场景 ............................................................................................... 1Token相关 ............................................................................................ 2的存储单页应用可以当使用么或者是一个比较复杂的问题,但是很多人用的时候都是一知半解,所以出现一些不正确或者不建议的做法。应用场景一个是在什么情况下应该使用的问题。第一种是应用自己完成认证授权的流程,通常的做法是通过用户名和密码登录认证;然后通过规则来判断用户是否有权限进行某些操作;这种跟没有半毛线关系第二种是,在第一种的基础上,应用也希望能够通过第三方登录(但同时自己也有一套用户机制),也就是典型的,那么应该考虑使用第三种是应用自己没有用户体系,需要借助第三方来进行认证,但应用自己管理资源。这种情况下也需要用来进行登陆认证,跟第二种没有实质的区别第四种是,在第一种的基础上,假设应用还需要访问一些其他的受保护的资源,比如你写博客的时候想用空间的照片。那么应该通过来获取对这个资源的访问权限即可 Token相关2第五种情况,应用通过第三方进行认证,有自己的资源;但同时也需要访问其他受保护的资源。这里认证肯定还是需要通过来实现;访问受保护的资源使用即可。对于用户自己的资源,可以根据自己的需要进行管理,而不需要通过什么。这里有一个很大的误区就是,认为凡是授权都需要,譬如第五种情况,的确我们通过完成认证体系;那么问题是,假设我访问自己的,是否需要走一遍的流程?试想我们这么做,那么可能会变成这样:用户通过登陆到你开发的一个博客网站,很开心,想自己去写博客什么的用户现在想去看自己的博客,而你需要得到一个,所以会弹出一个框告诉用户,你要访问你的博客,是否允许这不是很扯淡么。如果我认证之后每次都还需要这样做一次,那有什么意义存在呢?好吧,假设说你用一个的流程,这样应用自己可以去请求一个了,不需要用户参与。这样是否可行呢?如果跟是同一个应用,那么这样相当于我自己去拿一个,然后我自己验证这个,然后知道我是否有权限。且不论效率问题,唯一可能的场景就是必须要通过来获取用户的权限,但通常这些规则也必须要进行设置(那为什么要到中设置?这样通常代价更高)。如果跟不是一个应用,这样做倒是可以实现一个统一的权限管理机制,不过,唯一的问题就是性能问题。Token相关Token的存储Web APP如果应用有服务端,那么存储在服务端。浏览器通过跟服务器交互如果没有服务端,那么和应该存储在浏览器的内存中如果不得不存储在浏览器,那么可以通过加密之后存储在中Native/Mobile app可以存储在提供的安全存储中,例如:安卓中使用中使用SPA单页应用跟一样,如果有对应的后端支持,应该存储在的后端,但是需要通过某种机制去获取这个;如果没有对应的后端,那么只能存储在内存中。id_token可以当access_token使用么是由授权服务器颁发给的,比如请求一个的:https://authorization-server.com/authorize? response_type=code &client_id=egHuu4oJxgOLeBzPAQ9sXg4i Token相关3 &redirect_uri=https://www.oauth.com/playground/oidc.html &scope=openid+profile+email+photos &state=sRROJ_iPTam39Dc7 &nonce=eFRvo_n5ecyYU_Sv最后得到的是这样的:{ "sub": "concerned-caracal@example.com", "name": "Concerned Caracal", "email": "concerned-caracal@example.com", "iss": "https://pk-demo.okta.com/oauth2/default", "aud": "egHuu4oJxgOLeBzPAQ9sXg4i", "iat": 1600674514, "exp": 1603266514, "amr": [ "pwd" ]}这里aud即的,是可以被所信任的。而不是设计给使用的,所以显然不能使用代替。