2017-03-05 53 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

相關問題