2017-03-05 123 views
2

我在写一个需要使用OAuth2 Protocol进行验证的应用程序。我设法使用了Web Server App authentication mechanism,它工作得很好,唯一的问题是我在程序本身内部处理redirect_url,我不希望浏览器在新标签中提出请求。是否可以使用Google OAuth2在浏览器窗口中打开“redirect_url”?

如果可能,理想的解决方案是谷歌服务器会直接向我发送请求,或者它会打开和关闭浏览器选项卡/窗口。

也许这种方法不是最合适的,如果是的话请让我知道如何更好地做到这一点。

+0

你真的想做什么?通常情况下,重定向不会打开新的选项卡(但它会发出新的请求)。 –

+0

@TatsuyukiIshi问题是,通过这种认证,我需要在浏览器中打开同意窗口,然后同意窗口重定向到给定的url,当然,它确实执行请求。我的程序处理请求并没有问题,但浏览器选项卡已打开,因此无法关闭它,因为无法使用JavaScript关闭浏览器选项卡,该选项卡未由javascript打开。我的临时解决方案是返回一些HTML,告诉用户该程序收到了代码,但如果我可以直接显示该消息,它会更干净。 –

+0

您如何打开浏览器窗口?例如,如果它是一个为获得用户同意而打开浏览器的桌面应用程序,它可以通过向浏览器窗口发送消息来模拟用户的操作(包括关闭窗口)。如果它是一个web应用程序,它可以打开JavaScript('window.open()')的同意,以便它能够通过'window.close()'等关闭打开的窗口。 – weirdan

回答

0

是的它可能我实际上只是在我的.Net应用程序中使用Web浏览器控件。你已经标记了这个谷歌Oauth,所以我假设你正在使用谷歌身份验证服务器这样做。我怀疑你正在使用一个谷歌客户端库,默认情况下它会在新的浏览器窗口中打开它。例如,Google .Net客户端库就是为此而设计的。

诀窍可能需要您使用不需要重定向URI的本地或其他类型凭据来使用Web凭证。这些凭据通常用于已安装的应用程序,但它们可用于Web。用Web凭证做这件事可能是有可能的,但是我认为它会取决于你在做什么。

谷歌OAuth2流程:

在流程的第一步是创建网址的用户进行身份验证。这是一个网页,你无法做任何改变。所以你的应用程序需要能够向用户显示一个网页。

https://accounts.google.com/o/oauth2/auth?client_id={clientid}.apps.googleusercontent.com&redirect_uri=urn:ietf:wg:oauth:2.0:oob&scope=https://www.googleapis.com/auth/analytics.readonly&response_type=code 

通过提供骨灰盒:IETF:WG:OAuth的:2.0:OOB你基本上是告诉auth服务器只返回代码,你来自哪里,发送它。

该代码返回给您,您将需要将其交换。这个电话是一个HTTP POST。

https://accounts.google.com/o/oauth2/token 
code=4/X9lG6uWd8-MMJPElWggHZRzyFKtp.QubAT_P-GEwePvB8fYmgkJzntDnaiAI&client_id={ClientId}.apps.googleusercontent.com&client_secret={ClientSecret}&redirect_uri=urn:ietf:wg:oauth:2.0:oob&grant_type=authorization_code 

响应

{ 
"access_token" : "ya29.1.AADtN_VSBMC2Ga2lhxsTKjVQ_ROco8VbD6h01aj4PcKHLm6qvHbNtn-_BIzXMw", 
"token_type" : "Bearer", 
"expires_in" : 3600, 
"refresh_token" : "1/J-3zPA8XR1o_cXebV9sDKn_f5MTqaFhKFxH-3PUPiJ4" 
} 

现在你有一个刷新托克和访问令牌。您可以使用另一个HTTP POst呼叫刷新您的访问令牌。

https://accounts.google.com/o/oauth2/token 
client_id={ClientId}.apps.googleusercontent.com&client_secret={ClientSecret}&refresh_token=1/ffYmfI0sjR54Ft9oupubLzrJhD1hZS5tWQcyAvNECCA&grant_type=refresh_token 

响应

{ 
"access_token" : "ya29.1.AADtN_XK16As2ZHlScqOxGtntIlevNcasMSPwGiE3pe5ANZfrmJTcsI3ZtAjv4sDrPDRnQ", 
"token_type" : "Bearer", 
"expires_in" : 3600 
} 

所以只要你可以嵌入验证网址到您的应用程序,您可以自己去取。您不需要重定向URI。我对google 3 legged oauth2

+0

我不明白,如果浏览器涉及或如果它不是!如果不是,那么我需要提供一些方法来向用户显示页面而不使用浏览器,我已经在想这个了,但在我的情况下很难。因为我无法访问Web浏览器控件,所以我需要编写一个迷你Web浏览器我的自我,这可能很简单,或者很困难,因为我认为它需要执行一些js。 –

+0

另外,我知道代码并将其与'access_token'交换,我的应用程序的身份验证正确。 –

+0

有没有办法,最初的同意必须进行威盛该网页。但是,您可以创建自己的迷你浏览器。 – DaImTo

2

公平的警告,没有用过的OAuth这样的,但我有一个想法:

你就不能打开一个弹出与window.open()的的OAuth请求?
使用window.opener获取弹出窗口的父窗口就变得很简单。

的OAuth验证之后,你可以刷新与父: window.opener.location.reload();

然后,您可以简单地使用window.close()关闭弹出。

这种方式不会打开新的选项卡,您的应用程序将保持活动选项卡。

-1

教程既然你已经在使用非便携XDG开,你大概可以使用其他外部工具(xdotool)和模拟用户键盘输入与它:

xdotool search --onlyvisible --class "Chrome" windowfocus key 'ctrl+w' 

这将发送ctrl+w(关闭选项卡)到可见铬实例

请记住,可能会打开多个浏览器窗口。

+0

什么是'xdotool'?像“xdg-open”这样的标准吗? –

+0

[Xdotool](http://www.semicomplete.com/projects/xdotool)。它不像xdg-open那样广泛,但是可以作为大多数主要Linux发行版的软件包。 – weirdan

相关问题