小弟最近在写一个 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,直接连接到 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 上有什么不同的方案都希望能指点我一下