2014-02-24 178 views
9

我試圖對已安裝的應用程序使用新的incremental authorization,以便在保留現有範圍的同時將範圍添加到現有授權。這是使用新的include_granted_scopes=true參數完成的。但是,無論我嘗試過什麼,重新授權都會完全覆蓋範圍。這裏有一個最小的Bash的PoC劇本我已經寫了演示我的問題:Google OAuth 2.0 include_granted_scopes不適用於已安裝的應用程序

client_id='716905662885.apps.googleusercontent.com' # throw away client_id (non-prod) 
client_secret='CMVqIy_iQqBEMlzjYffdYM8A' # not really a secret 
redirect_uri='urn:ietf:wg:oauth:2.0:oob' 

while : 
do 
    echo "Please enter a list of scopes (space separated) or CTRL+C to quit:" 
    read scope 

    # Form the request URL 
    # http://goo.gl/U0uKEb 
    auth_url="https://accounts.google.com/o/oauth2/auth?scope=$scope&redirect_uri=$redirect_uri&response_type=code&client_id=$client_id&approval_prompt=force&include_granted_scopes=true" 

    echo "Please go to:" 
    echo 
    echo "$auth_url" 
    echo 
    echo "after accepting, enter the code you are given:" 
    read auth_code 

    # swap authorization code for access token 
    # http://goo.gl/Mu9E5J 
    auth_result=$(curl -s https://accounts.google.com/o/oauth2/token \ 
    -H "Content-Type: application/x-www-form-urlencoded" \ 
    -d code=$auth_code \ 
    -d client_id=$client_id \ 
    -d client_secret=$client_secret \ 
    -d redirect_uri=$redirect_uri \ 
    -d grant_type=authorization_code) 
    access_token=$(echo -e "$auth_result" | \ 
       grep -Po '"access_token" *: *.*?[^\\]",' | \ 
       awk -F'"' '{ print $4 }') 

    echo 
    echo "Got an access token of:" 
    echo $access_token 
    echo 

    # Show information about our access token 
    info_result=$(curl -s --get https://www.googleapis.com/oauth2/v2/tokeninfo \ 
    -H "Content-Type: application/json" \ 
    -d access_token=$access_token) 
    current_scopes=$(echo -e "$info_result" | \ 
        grep -Po '"scope" *: *.*?[^\\]",' | \ 
        awk -F'"' '{ print $4 }') 

    echo "Our access token now allows the following scopes:" 
    echo $current_scopes | tr " " "\n" 
    echo 
    echo "Let's add some more!" 
    echo 

done 

腳本簡單地執行OAuth授權,然後打印出當前令牌被授權使用的範圍。理論上它應該每次都會繼續添加範圍,但在實踐中,範圍列表每次都會被覆蓋。所以這個想法將在第一次運行,你會使用像email這樣的最小範圍,然後下一次運行,更像是隻讀日曆https://www.googleapis.com/auth/calendar.readonly。每次只提示用戶授權當前請求的範圍,但結果令牌適用於所有範圍,包括之前運行授權的範圍。

我嘗試過一個新的client_id/secret,結果是一樣的。我知道我可以再次包含已經授權的範圍,但是會提示用戶所有範圍,即使是已經授予的範圍,我們都知道範圍列表越長,用戶接受的可能性就越小。

更新:在進一步測試期間,我注意到permissions for my app確實顯示了每個增量授權的組合範圍。在增量認證之後,我試圖等待30秒左右,然後使用刷新標記獲取新的訪問標記,但該訪問標記仍限於上一個授權的範圍,而不是組合範圍列表的範圍。

更新2:我也玩弄保持原始刷新令牌。刷新標記只獲取允許原始作用域的新訪問標記,不包括增量添加的作用域。所以看起來include_granted_scopes=true對令牌沒有影響,舊的和新的刷新令牌繼續工作,但僅限於其指定的範圍。我無法獲得「組合範圍」刷新或訪問令牌。

+0

你有沒有得到任何迴應? – pinoyyid

+0

根本沒有反應。 –

+0

我有完全相同的問題(後續訪問令牌僅對該身份驗證鏈接中請求的作用域有效,而不是前面請求的任何作用域,即使include_granted_scopes爲true)。這使得增量授權對我們來說完全無法使用,並迫使我們爲我們需要訪問的不同範圍維護不同的訪問令牌,這實際上很煩人。任何人都能理解爲什麼這不起作用(至少對我們中的一些人來說)? – David

回答

7

谷歌的OAuth 2.0服務不支持安裝/本地應用增量權威性;它只適用於web server case。他們的文檔被破壞了。

+0

是的,我可以證實這一點。我剛剛遇到這個問題,並在Google搜索30秒後結束了。增量授權不適用於已安裝的應用程序。 – GetFree

1

嘗試將範圍的完整列表添加到第二個請求中,在該請求中交換訪問令牌的授權代碼。奇怪的是,scope參數doesn't seem to be documented,但它存在於由google-api-java-client生成的請求中。例如:

code=foo&grant_type=authorization_code 
&redirect_uri=http%3A%2F%2Flocalhost%3A8080%2Fmyapp%2FoauthCallback 
&scope=https%3A%2F%2Fwww.googleapis.com%2Fauth%2Fuserinfo.email+https%3A%2F%2Fwww.googleapis.com%2Fauth%2Fuserinfo.profile+https%3A%2F%2Fwww.googleapis.com%2Fauth%2Fplus.me+https%3A%2F%2Fwww.googleapis.com%2Fauth%2Fplus.stream.write 

web server scenario,授予範圍的完整列表,與授權碼一起返回時include_granted_scopes設置爲true。這是另一個信息,似乎從鏈接的文檔中缺少。

編輯1包括代碼交換請求範圍的完整列表適用於我們在Java應用程序,但我只是想你原來的劇本沒有修改(除了客戶端ID /密碼),它工作得精(編輯只是標識和標記):

$ bash tokens.sh 
Please enter a list of scopes (space separated) or CTRL+C to quit: 
https://www.googleapis.com/auth/userinfo.profile 
Please go to: 

https://accounts.google.com/o/oauth2/auth?scope=https://www.googleapis.com/auth/userinfo.profile&redirect_uri=urn:ietf:wg:oauth:2.0:oob&response_type=code&client_id=189044568151-4bs2mcotfi2i3k6qp7vq8c6kbmkp2rf8.apps.googleusercontent.com&approval_prompt=force&include_granted_scopes=true 

after accepting, enter the code you are given: 
4/4qXGQ6Pt5QNYqdEuOudzY5G0ogru.kv_pt5Hlwq8UYKs_1NgQtlUFsAJ_iQI 

Got an access token of: 
ya29.1.AADtN_XIt8uUZ_zGZEZk7l9KuNQl9omr2FRXYAqf67QF92KqfvXliYQ54ffg_3E 

Our access token now allows the following scopes: 
https://www.googleapis.com/auth/userinfo.profile 
https://www.googleapis.com/auth/userinfo.email 
https://www.googleapis.com/auth/plus.me 
https://www.googleapis.com/auth/plus.circles.read 

您可以看到以前授予範圍包括...

+0

我試過這個,但我發現如果範圍參數包含「舊範圍」,我在交換請求上得到無效的範圍錯誤。 –

+0

你知道嗎,我只是嘗試使用你的腳本而沒有修改,它似乎工作得很好。我會在一分鐘內更新我的答案。 – serengeti

+0

我可以用給定的腳本(以及我自己的服務器端應用程序)重現此錯誤,我從後續請求中獲得的訪問令牌總是僅對該請求所請求的作用域有效,而不是前面要求的範圍。這使我們無法使用增量式身份驗證。 – David

相關問題