使用Token作为凭证,从App免登陆跳转到Web是否足够安全?

我们有一个App,可以通过用户名密码登录我们的服务器。

现在我们有一个需求,就是从app里面打开网站的一个链接。这个链接是需要登录才能打开的。由于我们的app已经登录了服务器,因此我们想从app里面打开这个链接时,不再让用户又登录一次。

我们参考了OAuth机制做了下面的方案,但是不知道:

  1. 是否够安全?
  2. 把认证和授权分开来是否过度设计?
  3. 这个方案如果用在客户端上,也就是说客户端获得access token以后,就可以凭access token访问服务器资源,是否够全安?

请大神指教!

图片描述

说明:
(1) 使用HTTPS保护明文传送的密码或者密码的哈希码;
(2) Request Token存活时间很短;
(4) Access Token存活时间由各个业务系统定

补充一个典型流程的详细描述:
我把流程描述得细一点。
(1) 客户端App使用HTTPS GET,链接“认证服务器”,提交用户ID和密码(明文);
(2) 认证服务器验证用户ID和密码正确,生成一个32位的随机字符串作为Request Token,返回给客户端App,并在认证服务器中把Request Token关联到用户ID;
(3) 客户端使用HTTP GET链接到“授权服务器”,提交Request Token;
(4) (5) (6) 授权服务器拿Request Token到“认证服务器”查询,如果查到了userId,则生成一个Access Token,对应到UserId,并返回给客户端App,同时要求“认证服务器”销毁Request Token;如果Request Token超过5分钟没有被使用,会自动被删除;
(7) (8) 客户端App打开手机App浏览器,用浏览器向网站发起一个HTTP GET 请求,用Access Token做参数;
(9) (10) (11) 网站拿Access Token到授权服务器查找对应的UserId,如果找到了,则把浏览器请求的数据返回给浏览器;

2015.4.3更新:
我在知乎上看到 知友 @secloud 在这里 帮你深入理解OAuth2.0协议 提到一个 IAM 服务,说是比较适合客户端使用HTTP RESTful API去访问服务器资源的情况,可是我找了好久没有找到怎么实现IAM的资料。
倒是找到这篇:5 Keys To Web App Token Authentication ,讲怎么使用Token来做Web和App通用的用户身份认证。文中提到不能什么都往OAuth上靠,OAuth的应用场景,是第三方认证。如果云和端都是自有系统,就做简单的Token验证好了。我觉得这个结论挺靠谱的。

2015.4.3第二次更新
查了一些资料,觉得上面的结构不对。
1. OAuth 2.0 - Authorization Code Grant和Implict Grant类型适用于第三方认证,不符合我们的应用场景,即我们的客户端是自有的、可信的。应该适用OAuth 2.0 - Client Credentials Grant模型
2. 客户端使用Request Token去换取Access Token的过程多余,不会增加任何安全性,反而增加复杂度;
因此,所谓的“授权服务器”可以去掉。
其实,JSON Web Token (JWT) 是专门为兼容Web和Mobile App身份认证设计的,目前正在进入OAuth 2.0草案,和OAuth 2.0 - Client Credentials Grant模型相比,JWT通过对token进行加密或者签名,还规定了用户身份信息的数据结构。未来如果我们有更高的安全性和性能方面的需要,再考虑。
参考:
http://tools.ietf.org/html/rfc6749
https://tools.ietf.org/html/draft-ietf-oauth-json-web-token-32
https://auth0.com/blog/2014/01/07/angularjs-authentication-with-cookie...
https://auth0.com/blog/2014/01/27/ten-things-you-should-know-about-tok...
http://alexbilbie.com/2013/02/a-guide-to-oauth-2-grants/

2 个回答

1
采纳
我是宅男小何 338  4月1日 回答

个人认为授权服务器是多余的,client游览需要登录的页面,直接把token通过cookie,传给网站后台服务器,网站后台服务器拿到token去认证服务器验证,验证成功就返回页面内容,验证失败就返回未登录。

0
暗夜的怒吼 1  4月2日 回答

挺好的,Request Token是长时间保存的,Access Token是一次性的是吧?

### 回答1: uni-app 是一个使用 Vue.js 开发跨平台应用的框架。在 uni-app 中实现前端登录功能,通常有以下几种方式: 1. 使用 uni.login() 方法获取微信小程序的登录凭证 code,然后将 code 发送给后端服务器,由服务器使用 code 换取 openid 和 session_key。 2. 在前端页面中使用表单提交用户名和密码到服务器,由服务器验证用户名和密码并返回 token。 3. 使用第三方登录服务,如微信登录、QQ 登录、微博登录等。 具体实现方式取决于你的业务需求和服务端的接口。 ### 回答2: uni-app是一种基于Vue.js的跨平台开发框架,可以一次编写代码,同时生成可以运行在多个平台(iOS、Android、Web等)上的应用程序。下面是一个基本的uni-app前端登录示例。 1. 创建登录页面:在uni-app中,可以使用Vue的模板语法来创建登录页面,包括输入用户名和密码的表单,以及登录按钮。 2. 数据绑定:使用Vue的双向数据绑定,将输入框中的用户名和密码与页面的数据进行绑定,以便可以在登录时获取用户输入的值。 3. 发起登录请求:当用户点击登录按钮时,可以通过uni-app提供的API发起登录请求,将用户名和密码作为参数传递给后端接口。 4. 处理登录结果:根据后端接口返回的数据进行处理,可以使用异步回调函数或者Promise等方式进行处理。根据登录结果,可以给出相应的提示信息,如登录成功或登录失败。 5. 登录成功后的操作:如果登录成功,可以进行一些额外的操作,比如跳转到首页、保存用户登录状态等。 6. 错误处理:如果登录失败,可以给出相应的提示信息,如用户名或密码错误等。 7. 表单验证:可以添加一些简单的前端表单验证,如判断用户名和密码是否为空,输入是否符合要求等。 总结:以上是一个简单的uni-app前端登录流程,通过创建登录页面、数据绑定、发起登录请求、处理登录结果、登录成功后的操作以及错误处理等步骤,实现了一个基本的前端登录功能。当然,具体的实现还可以根据实际需求进行扩展和优化。 ### 回答3: uni-app是一个跨平台的开发框架,可以同时开发iOS、Android和H5应用。实现前端登录功能,我们可以借助uni-app提供的一些工具和技术来完成。 首先,我们需要创建一个登录页面,包括用户名和密码的输入框以及登录按钮。用户输入用户名和密码后,点击登录按钮可以触发相应的登录事件。 在uni-app中,我们可以使用Vue.js来处理用户输入和点击事件。可以在data中定义一个对象,用于保存用户名和密码的值。然后,使用v-model指令将输入框的值与data中的对象绑定起来,这样用户在输入框中输入的内容会自动同步到对应的data对象中。 当用户点击登录按钮时,可以通过调用uni-app提供的API发送登录请求到后端服务器。可以使用uni.request方法发送HTTP请求,并传递用户名和密码作为请求参数。可以在请求成功的回调函数中进行相应的处理,比如保存用户的登录状态等。 在前端登录过程中,还可以使用uni-app提供的拦截器(interceptor)来处理用户的登录状态。在每次请求发送前,可以通过拦截器判断用户是否已登录,如果未登录则跳转到登录页面进行认证,否则继续发送请求。 此外,为了提高用户体验和安全性,还可以使用uni-app的本地存储功能来保存用户的登录状态和登录凭证。可以使用uni.setStorage方法将用户的登录信息保存到本地存储中,并使用uni.getStorage方法从本地存储中获取用户的登录信息。 总的来说,uni-app前端登录需要创建登录页面,处理用户输入和点击事件,发送登录请求到后端服务器,并根据返回结果判断登录是否成功。同时,还需要使用拦截器来处理用户的登录状态,以及使用本地存储来保存登录信息。通过这些步骤,我们就可以实现uni-app前端登录功能。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值