C# 用于服务应用程序的Google oAuth 2.0(JWT令牌请求)
我正在尝试为这里描述的服务帐户实现GoogleOAuth2:在UnityScript(或C#-这没关系,因为它们都使用相同的Mono.NET类)上 我在这里发现了类似的话题: web-token-jwt-example-in-c但我仍然没有成功 首先,我已经生成了header和claimset(就像在谷歌文档中一样)C# 用于服务应用程序的Google oAuth 2.0(JWT令牌请求),c#,oauth,oauth-2.0,google-oauth,jwt,C#,Oauth,Oauth 2.0,Google Oauth,Jwt,我正在尝试为这里描述的服务帐户实现GoogleOAuth2:在UnityScript(或C#-这没关系,因为它们都使用相同的Mono.NET类)上 我在这里发现了类似的话题: web-token-jwt-example-in-c但我仍然没有成功 首先,我已经生成了header和claimset(就像在谷歌文档中一样) var header:String=GetJWTHeader(); var-claimset:String=GetJWTClaimSet(); 结果是(为了清晰起见,用新行分隔)
var header:String=GetJWTHeader();
var-claimset:String=GetJWTClaimSet();
结果是(为了清晰起见,用新行分隔):
{“alg”:“RS256”,“类型”:“JWT”}
{“iss”:“425466719070-1dg2rebp0a8fn9l02k9ntr6u5o4a8lp2.apps.googleusercontent.com”
“范围”:“范围”
“澳元”:“
“经验”:1340222315
“iat”:1340218715}
Base-64编码方法:
公共静态函数Base64Encode(b:byte[]):字符串{
变量s:String=Convert.ToBase64String(b);
s=s。替换(“+”,“-”;
s=s。替换(“/”,“”);
s=s.Split(“=”[0])[0];//删除任何尾随的“=”
返回s;
}
公共静态函数Base64Encode(s:String):String{
返回Base64Encode(Encoding.UTF8.GetBytes);
}
然后我要签名
var to_符号:字节[]=
Encoding.UTF8.GetBytes(Base64Encode(header)+“+Base64Encode(claimset));
var证书:X509Certificate2=
新的X509Certificate2(google_pvt_key.ToArray(),“notasecret”);
var rsa:rsacyptoserviceprovider=cert.PrivateKey;
var sgn:String=Base64Encode(rsa.SignData(to_-sign,“SHA256”);
var jwt:String=Base64Encode(头)+“+”Base64Encode(索赔集)+
“+sgn;
然后形成请求:
var-url:String=”https://accounts.google.com/o/oauth2/token";
变量形式:WWWForm=新的WWWForm();
表格.AddField(“授权类型”、“断言”);
AddField(“断言类型”http://oauth.net/grant_type/jwt/1.0/bearer");
表单.AddField(“断言”,jwt);
var headers:Hashtable=form.headers;
标题[“内容类型”]=“应用程序/x-www-form-urlencoded”;
var www:www=newwww(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",
尝试使用.Net库
您可以从NuGet安装它。
请参阅本文中的示例(我使用它来验证websockets服务器,但JWT处理是通用的)
我在c#中实现服务帐户身份验证时也遇到了困难!您能为我确认您成功地使用了示例中所示的“授予类型”和“断言类型”字段吗?谢谢你是我的英雄!非常感谢你!我希望我能投10票:D