使用Doorkeeper、Devise的Expo Auth Session登录后浏览器不关闭如何解决?
解决 Expo Auth Session + Devise 登录后浏览器不关闭的问题
问题现象
在React Native应用中使用expo-auth-session做OAuth身份验证时,登录/注册操作完成后,唤起的浏览器窗口不会自动关闭。但如果再次发起登录请求,因为浏览器已有会话,操作能正常完成且窗口会关闭。
原因分析
Expo内置浏览器无法处理Rails Turbo返回的TURBO STREAM格式响应,而Devise默认启用Turbo,导致登录后的回调响应格式不被Expo识别,无法触发窗口关闭逻辑。
解决步骤
只需禁用Devise登录/注册表单的Turbo功能,确保oauth/authorize端点返回HTML格式响应即可:
- 修改Devise表单
在Devise生成的登录或注册表单中,添加data-turbo="false"属性:
<%= form_for(resource, as: resource_name, url: session_path(resource_name), data: { turbo: false }) do |f| %> <!-- 原有表单内容 --> <% end %>
- 或在控制器中强制响应格式
如果不想修改表单,可在Devise的Sessions控制器中重写create方法,明确指定响应格式为HTML:
class Users::SessionsController < Devise::SessionsController def create super do |resource| respond_to do |format| format.html { super } format.turbo_stream { redirect_to after_sign_in_path_for(resource), format: :html } end end end end
设置完成后,登录/注册操作结束时,Expo浏览器能正确识别HTML响应,触发expo-auth-session的回调逻辑,自动关闭浏览器窗口。
内容的提问来源于stack exchange,提问作者Tim Dowling
相关产品推荐
相关产品推荐

