是的它可能我实际上只是在我的.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
你真的想做什么?通常情况下,重定向不会打开新的选项卡(但它会发出新的请求)。 –
@TatsuyukiIshi问题是,通过这种认证,我需要在浏览器中打开同意窗口,然后同意窗口重定向到给定的url,当然,它确实执行请求。我的程序处理请求并没有问题,但浏览器选项卡已打开,因此无法关闭它,因为无法使用JavaScript关闭浏览器选项卡,该选项卡未由javascript打开。我的临时解决方案是返回一些HTML,告诉用户该程序收到了代码,但如果我可以直接显示该消息,它会更干净。 –
您如何打开浏览器窗口?例如,如果它是一个为获得用户同意而打开浏览器的桌面应用程序,它可以通过向浏览器窗口发送消息来模拟用户的操作(包括关闭窗口)。如果它是一个web应用程序,它可以打开JavaScript('window.open()')的同意,以便它能够通过'window.close()'等关闭打开的窗口。 – weirdan