Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/295.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 用于服务应用程序的Google oAuth 2.0(JWT令牌请求)_C#_Oauth_Oauth 2.0_Google Oauth_Jwt - Fatal编程技术网

C# 用于服务应用程序的Google oAuth 2.0(JWT令牌请求)

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(); 结果是(为了清晰起见,用新行分隔)

我正在尝试为这里描述的服务帐户实现GoogleOAuth2:在UnityScript(或C#-这没关系,因为它们都使用相同的Mono.NET类)上

我在这里发现了类似的话题: web-token-jwt-example-in-c但我仍然没有成功

首先,我已经生成了header和claimset(就像在谷歌文档中一样)

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

我花了两天的时间试图找出问题所在,但我看不出来

而且,我找不到任何合适的文档和示例

我只是想收到一张代币

  • 我是否用正确的方式对字节进行签名
  • 索赔集中的“范围”参数应该是什么样的?我试过“和”
  • “iss”参数应该等于什么?客户id或电子邮件地址?(两者都试过了)
  • 有什么方法可以找出我的错误
  • 是否有服务应用程序的C#库(不适用于已安装的应用程序或客户端登录)

  • 我快疯了。。。它必须工作,但它不…:-/

    解决方案是,在请求代码中,所有斜杠都必须反斜杠

    错:

    "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