<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>ypan887 (ypan)</title>
    <link>https://ruby-china.org/ypan887</link>
    <description/>
    <language>en-us</language>
    <item>
      <title>问：Omniauth Rails Api 如何和前端 app 结合</title>
      <description>&lt;p&gt;小弟最近在写一个 Rails api 来管理所有的 user authentication。前端可以是 web app 也可以是 mobile app（reactJS and react Native)。API 本身已经通过 devise-auth-token 这个 gem 写好（本质上就是 omniauth) 但是在前端 app 的实现上碰到一些问题，希望能获得一些指教。&lt;/p&gt;

&lt;p&gt;首先我对 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&lt;/p&gt;

&lt;p&gt;但在实际编程过程中，我碰到两个问题：&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;ajax 如何打开 Oauth 登录页面&lt;/li&gt;
&lt;li&gt;oatuh call back 是应该发送动 web app 还是应该发送的 api? &lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;我目前找到两种方案来解决这两个问题，但是都感觉不是很理想：&lt;/p&gt;

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

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

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

&lt;p&gt;方案 2，如果直接 callback 到 webapp 则 webapp 需要有相关的 server code 来处理 request&lt;/p&gt;

&lt;p&gt;不知道坛上有没有人遇到过类似的问题。对以上两个方案有什么建议或者在处理 oauth 上有什么不同的方案都希望能指点我一下&lt;/p&gt;</description>
      <author>ypan887</author>
      <pubDate>Wed, 11 Jan 2017 16:18:42 +0800</pubDate>
      <link>https://ruby-china.org/topics/32104</link>
      <guid>https://ruby-china.org/topics/32104</guid>
    </item>
  </channel>
</rss>
