我試圖在此處描述的服務帳戶實施Google oAuth 2:UnityScript上的https://developers.google.com/accounts/docs/OAuth2ServiceAccount(或C# - 這並不重要,因爲它們都使用相同的Mono .NET類)。適用於服務應用程序的Google oAuth 2.0(JWT令牌請求)
我在這裏找到了類似的主題:Is there a JSON Web Token (JWT) example in C#? web-token-jwt-example-in-c但我仍然沒有成功。
拳的是,我已生成的頭和claimset(即就像谷歌文檔中)
var header: String = GetJWTHeader();
var claimset: String = GetJWTClaimSet();
結果(爲清楚起見新行分開):
{ 「ALG」: 「RS256」, 「典型」: 「智威湯遜」}
{ 「ISS」: 「425466719070-1dg2rebp0a8fn9l02k9ntr6u5o4a8lp2.apps.googleusercontent.com」,
「範圍」: 「https://www.googleapis.com/auth/prediction」,
「AUD」: 「https://accounts.google.com/o/oauth2/token」,
「EXP」:1340222315,
「IAT」:1340218715}
基地-64編碼方法:
public static function Base64Encode(b: byte[]): String {
var s: String = Convert.ToBase64String(b);
s = s.Replace("+", "-");
s = s.Replace("/", "_");
s = s.Split("="[0])[0]; // Remove any trailing '='s
return s;
}
public static function Base64Encode(s: String): String {
return Base64Encode(Encoding.UTF8.GetBytes(s));
}
然後我在做一個簽名URE。
var to_sign: byte[] =
Encoding.UTF8.GetBytes(Base64Encode(header) + "." + Base64Encode(claimset));
var cert: X509Certificate2 =
new X509Certificate2(google_pvt_key.ToArray(), "notasecret");
var rsa: RSACryptoServiceProvider = cert.PrivateKey;
var sgn: String = Base64Encode(rsa.SignData(to_sign, "SHA256"));
var jwt: String = Base64Encode(header) + "." + Base64Encode(claimset) +
"." + sgn;
,然後形成請求:
var url: String = "https://accounts.google.com/o/oauth2/token";
var form: WWWForm = new WWWForm();
form.AddField("grant_type", "assertion");
form.AddField("assertion_type", "http://oauth.net/grant_type/jwt/1.0/bearer");
form.AddField("assertion", jwt);
var headers: Hashtable = form.headers;
headers["Content-Type"] = "application/x-www-form-urlencoded";
var www: WWW = new WWW(url, form.data, headers);
而且我得到的是 「錯誤400:壞請求」。
的編碼數據看起來像(添加爲了清楚換行符):
eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9。
eyJpc3MiOiI0MjU0NjY3MTkwNzAtMWRnMnJlYnAwYThmbjlsMDJrOW50cjZ1NW80YThscDIuYXBwcy5nb29nbGV1c2VyY29udGVudC5jb20iLCJzY29wZSI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL2F1dGgvcHJlZGljdGlvbiIsImF1ZCI6Imh0dHBzOi8vYWNjb3VudHMuZ29vZ2xlLmNvbS9vL29hdXRoMi90b2tlbiIsImV4cCI6MTM0MDIyMjMxNSwiaWF0IjoxMzQwMjE4NzE1fQ。
lIFg7-Og_BcC5qpICLt7USwGIHUOz-vV4ADNq0AWhuRtsvFrbZn5mxk4n9r5qU66q4reTVVAtuW06DeGsdcBMNgEdIMvN6VuYQybs64p9mqrfECBYxO1FWHbUG-2On1IpowybEsRRUjZfp0jFuEY7SLE3XRaXan0k5zmejcvLQo
我花了兩天時間試圖弄清楚什麼是錯的,但我看不到。
此外,我找不到任何合適的文檔和示例。
我只是想接收一個令牌。
- 我是否正確地簽署了字節?
- 聲明集中的「範圍」參數應該是什麼樣子?我試過「https://www.googleapis.com/auth/devstorage.readonly」和「https://www.googleapis.com/auth/prediction」。
- 什麼「iss」參數應該等於?客戶ID或電子郵件地址? (兩者都試過)
- 有什麼方法可以找出我的錯誤?
- 服務應用程序是否有任何C#庫(不適用於已安裝的應用程序或客戶端登錄)?
我越來越瘋狂......它的工作,但它不...: -/
我在C#中實現服務帳戶身份驗證時也很困難!你能否證實你成功地使用了grant_type和assertion_type字段,就像它們在你的例子中顯示的那樣?謝謝 – Nick