安全 问:Omniauth Rails Api 如何和前端 app 结合

ypan887 · January 11, 2017 · Last by ypan887 replied at January 14, 2017 · 6771 hits

小弟最近在写一个 Rails api 来管理所有的 user authentication。前端可以是 web app 也可以是 mobile app(reactJS and react Native)。API 本身已经通过 devise-auth-token 这个 gem 写好(本质上就是 omniauth) 但是在前端 app 的实现上碰到一些问题,希望能获得一些指教。

首先我对 OAuth flow 的理解是这样的: 假设我要设计一个 twitter 的登录按钮 点击按钮后,web app 会发出一个 ajax call 到 twitter 的 auth endpoint,twitter 将用户转到他的 Oauth 登录页,让用户登录授权 用户登录授权以后,twitter callback url 返回至 web app,然后在 call back url params 里会有 access token(twitter 这里好像是返回一个 oauth_token 和 oauth_verifier) 然后再发一个包含 oauth token he verifier 的 ajax call 到 api,api 和服务器验证之后,核发 access token(也可以是 JWT)作为 response 返回给 web wpp

但在实际编程过程中,我碰到两个问题:

  1. ajax 如何打开 Oauth 登录页面
  2. oatuh call back 是应该发送动 web app 还是应该发送的 api?

我目前找到两种方案来解决这两个问题,但是都感觉不是很理想:

方案 1:不使用 ajax,直接连接到 twitter 的 auth endpoint 来登陆授权。授权后 callback 至 api,api 把生成的 acess token 作为 query params 然后重新访问 webapp,webapp 从 url 里解析 access params

方案 2:使用 windows.open 打开新窗口,然后用 setTimeout 来不断监视新窗口,如果用户授权完则关闭窗口。callback 设置为 webapp。webapp 收到 callback 后使用 ajax 向 api 的 endpoint 发送用户授权信息并获得 access token 返回。

我已经完成了方案 1,但方案 1 的缺点是 access token 作为 query params 返回会显示在 url 和 log 里,虽然可以 filter 掉,但总感觉不是很理想

方案 2,如果直接 callback 到 webapp 则 webapp 需要有相关的 server code 来处理 request

不知道坛上有没有人遇到过类似的问题。对以上两个方案有什么建议或者在处理 oauth 上有什么不同的方案都希望能指点我一下

iOS 和 macOS 支持应用程序协议的:

yourapp://callback?code=xxx

#1 楼 @huacnlee 不好意思。。能稍微展开来讲讲么 比如在 ios 上,ios app 应该是怎么个流程和后端的 rails api 完成 Twitter Oauth 的互动

You need to Sign in before reply, if you don't have an account, please Sign up first.