16

ここで説明されているサービス アカウントに Google oAuth 2 を実装しようとしています: https://developers.google.com/accounts/docs/OAuth2ServiceAccount on UnityScript (または C# - どちらも同じ Mono .NET を使用するため、問題ありません)クラス)。

ここで同様のトピックを見つけました: Is there a JSON Web Token (JWT) example in C#? web-token-jwt-example-in-c ですが、まだ成功していません。

まず第一に、ヘッダーとクレームセットを生成しました (これは、Google のドキュメントとまったく同じです)

var header: String = GetJWTHeader();
var claimset: String = GetJWTClaimSet();

結果は次のとおりです (わかりやすくするために改行で区切られています)。

{"alg":"RS256","typ":"JWT"}

{"iss":"425466719070-1dg2rebp0a8fn9l02k9ntr6u5o4a8lp2.apps.googleusercontent.com",

"スコープ":" https://www.googleapis.com/auth/prediction ",

"aud":" https://accounts.google.com/o/oauth2/token ",

"exp":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);

そして、「Error 400: Bad request」だけが表示されます。

エンコードされたデータは次のようになります (わかりやすくするために改行が追加されています)。

eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.

eyJpc3MiOiI0MjU0NjY3MTkwNzAtMWRnMnJlYnAwYThmbjlsMDJrOW50cjZ1NW80YThscDIuYXBwcy5nb29nbGV1c2VyY29udGVudC5jb20iLCJzY29wZSI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL2F1dGgvcHJlZGljdGlvbiIsImF1ZCI6Imh0dHBzOi8vYWNjb3VudHMuZ29vZ2xlLmNvbS9vL29hdXRoMi90b2tlbiIsImV4cCI6MTM0MDIyMjMxNSwiaWF0IjoxMzQwMjE4NzE1fQ.

LIFG7-Og_BcC5qpICLt7USwGIHUOz-vV4ADNq0AWhuRtsvFrbZn5mxk4n9r5qU66q4reTVVAtuW06DeGsdcBMNGEdIMvN6VuYQybs64p9mqrfECBYxO1FWHbug-2On1IpowybEsRRUjZfp0jFuEYXRajmeXanc0SLE3

何が悪いのかを理解しようと2日間費やしましたが、わかりません。

また、適切なドキュメントや例が見つかりませんでした。

トークンを取得しようとしています。

  1. バイトに正しい方法で署名していますか?
  2. クレームセットの「スコープ」パラメーターはどのように見えるべきですか? 「 https://www.googleapis.com/auth/devstorage.readonly」と「https://www.googleapis.com/auth/prediction 」を試しました。
  3. どの「iss」パラメーターと等しくする必要がありますか? クライアントIDまたは電子メールアドレス? (両方試しました)
  4. 私の間違いを見つける方法は何ですか?
  5. サービス アプリケーション用の C# ライブラリはありますか (インストール済みアプリやクライアント ログイン用ではありません)。

私は頭がおかしくなっています...動作する必要がありますが、動作しません... :-/

4

2 に答える 2

8

解決策は、リクエストコードですべてのスラッシュをバックスラッシュにする必要があることでした

違う:

"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",
于 2012-06-20T22:32:54.717 に答える
-1

system.identitymodel.tokens.jwt .Net ライブラリを使用してみてくださいNuGet からインストールできます。こちらの投稿の例を参照してください (websockets サーバーの認証に使用しましたが、JWT の処理は一般的なものです)。

http://mydevtricks.blogspot.co.il/2014/10/xsocketsnet-authentication-with-jwt.html

于 2014-10-11T09:32:22.950 に答える