2017-04-20 179 views
1

我需要将社交登录集成到我的web应用程序。我使用Spring Boot作为我的后端,Angular 2作为前端技术。我跟着this教程来设置我的项目。使用Spring Boot和Angular 2 CLI的Google OAuth2身份验证

这个工作完美,Spring Boot在http:/ localhost:8080和Angular 2上运行http:/ localhost:4200。其原因在于我使用Angular-cli来实现实时重载开发服务器功能。

由于Cross Origin策略,角度项目需要使用代理。正如在前面的教程中提到,你需要配置一个proxy.conf.json文件:

{ 
    "/api": { 
    "target": "http://localhost:8080", 
    "secure": false 
    } 
} 

如果你这样做,你可以存取权限的春天API如下:HTTP:/本地主机:4200/API /例如用户(每个'/ api'请求将被转发到Spring服务器)。

以上所有内容都可以正常工作。现在我需要使用谷歌登录Oauth2。我尝试了很多教程,如this,但我似乎无法解决这个问题。

如果我尝试执行此操作并导航到http:/ localhost:8080(从Spring Boot地址),我将重定向到google登录页面,但是当尝试使用相同的操作时,例如http:/ localhost:4200/api/authenticate我只是总是重定向到http:/ localhost:4200 /登录immediatly没有重定向到登录页面。

我看了evrywhere在线,但似乎无法找到这个特定的问题。任何人都可以帮助我理解或者我做错了什么,也许有人拥有很棒的示例代码!

回答

0

我找到了解决我的问题的方法。首先我有一个'href =/api/authenticate'的登录链接,但这不起作用!

注:@ EnableOAuth2Sso标准确保了服务器上的每个路径,所以你只需要存取权限被固定到被重定向到登录页面

出于某种原因,HTTP的路径上的API:/ 4200/api/authenticate没有做任何事情,但立即重定向到http:/ 4200/login(我猜这必须是@ EnableOAuth2Sso的标准行为,如果身份验证失败或者如果您未通过身份验证?)

所以我将href更改为' HREF = HTTP:/本地主机:8080/API /认证”。这完美地工作,并将我重定向到谷歌登录页面。

我面临的另一个问题是重定向url。我尝试将重定向网址直接设置为“http:/ localhost:4200/profile”,以在登录到用户配置文件后进行导航,但出于一些更奇怪的原因,这再次无法工作。

经过一番测试,我发现你需要首先重定向到你的api域(不知道为什么)。

所以我设置的重定向URL为http:/本地主机:8080 /回调在哪里,然后重定向到的个人资料页上的端口4200

@GetMapping("/callback") 
void redirect(HttpServletResponse response) throws IOException { 
    response.sendRedirect("http://localhost:4200/profile"); 
} 

搜索和测试的方式来长后,我觉得这在任何地方都没有记录。

+0

你在哪里指定'/ callback'作为网址进行验证?我坚持类似的情况...如果你帮我,我会感谢你的男人:) –

+0

我对你的问题增加了一个额外的答案。 –

0

对不起,如果我错了在这个答案,因为这是前一段时间,我不记得确切。但我有一个登录按钮,如下图所示的代码片段:

<a href="http://localhost:8080/api/login" class="btn loginBtn loginBtn-google">Login with Google</a> 

因为你已经到位@ EnableOAuth2Sso每条路径会自动的OAuth2认证保护。所以当你点击登录按钮时,你会自动进入谷歌认证页面。

当你进行身份验证成功地我重定向到下面的代码:

@GetMapping("/api/login") 
public void login(HttpServletResponse response) throws IOException { 
    response.sendRedirect("http://localhost:4200/profile"); 
} 

正如我在我的第一个答案解释是nessecary,一些奇怪的原因,春域,而不是回调您将前端域。如上面的代码所示,然后重定向正确的forntend页面。

(随着时间的推移,我改变我的路径的名字,如果你想知道但这应该工作)