2015-04-06 82 views
0

我有一个Appengine/GWT应用程序,并实现了OAuth。它有效,但我现在在Oauth回调中重定向。此重定向不会提供流畅的用户体验,因为应用程序在登录后会重新加载。如何在没有重定向的OAuthCallBack后返回客户端

这是我的回调代码:

public void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { 
    String oauth_provider = req.getParameter("oauth_provider"); 
    String oauth_token = req.getParameter("oauth_token"); 
    String oauth_verifier = req.getParameter("oauth_verifier"); 
    String redirect = "http://www.exmaple.com"; 
    OAuthProvider oAuthProvider = OAuthProvider.valueOf(oauth_provider); 
    String providerUserId = createUser(oAuthProvider, oauth_verifier, oauth_token); // which creates the user in my application if not yet existing 
    redirect = redirect.concat("?oauth_provider=" + oAuthProvider.name() + "&user=" + providerUserId); 
    resp.sendRedirect(redirect); 
} 

的客户端程序将使用他的URL参数,以获得我的应用程序的用户对象。

有没有更好的方式来回到客户端,没有重定向?

+1

是的,这是一种方法。从客户端JavaScript谷歌现在在他们的库中有一个不重定向的新弹出模式。相反,它会启动一个弹出窗口,父级从URL片段抓取刷新令牌。更平滑但只有更新的浏览器支持该弹出模式。 Id使它成为一个答案,但没有时间添加链接到移动文档的链接:) – 2015-04-07 04:01:12

+0

我将不胜感激,如果你可以提供链接,当你在网上.. :-) – peternees 2015-04-08 20:27:19

+0

对不起,我找不到它,但从这里开始并研究新的“弹出”模式。这将在弹出窗口中显示auth而不是新窗口,这样可以更轻松地从URL重定向https://developers.google.com/identity/protocols/OAuth2UserAgent中的片段中捕获令牌。我认为谷歌+登录按钮的官方文档可能更好地解释弹出的东西 – 2015-04-08 22:38:22

回答

0

小改进:我发现我可以在appengine中使用会话。这样,我可以做重定向,而不需要传递url参数。这提供了更平滑的用户体验。但它仍然是一个重定向,我希望我能赶上那..

在AppEngine上的web-app.xml的

,设置

<sessions-enabled>true</sessions-enabled> 

回调:

public class OAuthCallback extends HttpServlet { 
public void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { 
     String oauth_provider = req.getParameter("oauth_provider"); 
     String oauth_token = req.getParameter("oauth_token"); 
     String oauth_verifier = req.getParameter("oauth_verifier"); 
     OAuthProvider oAuthProvider = OAuthProvider.valueOf(oauth_provider); 
     String providerUserId = createUser(oAuthProvider, oauth_verifier, oauth_token); // which creates the user in my application if not yet existing 
     req.getSession().setAttribute("oauth_user", new MyUser(oAuthProvider, providerUserId)); 
     resp.sendRedirect("http://www.example.com"); 
    } 
} 

重定向程序将使用用于识别用户的会话属性:

User oauthUser = (MyUser) session.getAttribute("oauth_user"); 
相关问题