我试图为这里描述的服务帐户实现谷歌oAuth 2:https://developers.google.com/accounts/docs/OAuth2ServiceAccount在UnityScript(或C#-这没关系,因为他们都使用相同的Mono。NET类)。
我在这里发现了类似的主题:C#中是否有JSON Web令牌(JWT)示例?web-token-jwt-example-in-c但我仍然没有成功。
首先,我已经生成了标题和声明集(就像在谷歌留档)
var header: String = GetJWTHeader();
var claimset: String = GetJWTClaimSet();
结果是(为了清晰起见,用新行分隔):
{"alg":"RS256","typ":"JWT"}
{“iss”:“425466719070-1dg2rebp0a8fn9l02k9ntr6u5o4a8lp2.apps.googleusercontent.com”,
“范围”:https://www.googleapis.com/auth/prediction",
“澳元”:https://accounts.google.com/o/oauth2/token",
“经验”:1340222315,
"iat": 1340218715}
Base-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));
}
然后我要签名。
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。
EYJPC3MIOII3MJWnzatmWnjLnWnWnWnWnWc5Nb29Nbgv1cy29UdgVc20Ilcjzy29WzSi6IMH0DHBZOi8VD3LMDVB2DSZWFWaxmuy29TL2FgVCHjLzglVbiiSimf1Zci6IMH0DHBZI8VyWnJb3VwWb3VwZZZZZ2L2LmWnWnzZI9Lv9VyWnWf1ZciFf1ZcizZI8VyWnzZI6VnzZZI6VyWnzZZZZZZZI8L6VnWnzZZZZZZZZI8LmWnWnWnzZZI。
lIFg7-Og_BcC5qpICLt7USwGIHUOz-VV4ADNQ0AWHURTSVFRBZN5MXK4N9R5QU66Q4RETVVATUW06DEGSDCMBNGEDIMVN6VUYQYBS64P9MQRFECBYXO1WHBUG-2ON1IPOWYBESRJZFP0JFUEY7SLE3XRAXAN0K5ZMEJCVLQO
我花了两天时间试图找出问题所在,但我看不见。
此外,我找不到任何合适的留档和例子。
我只是想收到一个信物。
我快疯了...它必须工作,但它没有...:-/
解决方案是,在请求代码中,所有斜杠都必须反斜杠
错误:
"scope":"https://www.googleapis.com/auth/prediction",
"aud":"https://accounts.google.com/o/oauth2/token",
对的:
"scope":"https:\\/\\/www.googleapis.com\\/auth\\/prediction",
"aud":"https:\\/\\/accounts.google.com\\/o\\/oauth2\\/token",
尽量使用system.identitymodel.tokens.jwt。NET库您可以从Nuget安装它。在我的帖子中看到的例子(我用它来验证webocket服务器,但是JWT处理是通用的)
http://mydevtricks.blogspot.co.il/2014/10/xsocketsnet-authentication-with-jwt.html