2012-06-20 38 views
11

Tôi đang cố gắng triển khai Google oAuth 2 cho tài khoản dịch vụ được mô tả tại đây: https://developers.google.com/accounts/docs/OAuth2ServiceAccount trên UnityScript (hoặc C# - không quan trọng vì cả hai đều sử dụng cùng một Mono .NET các lớp học).Google oAuth 2.0 (yêu cầu mã thông báo JWT) cho Ứng dụng Dịch vụ

Tôi đã tìm thấy chủ đề tương tự tại đây: Is there a JSON Web Token (JWT) example in C#? web-token-jwt-example-in-c nhưng tôi vẫn không thành công. tiêu đề

Fist của tất cả, tôi đã tạo ra và claimset (nghĩa là giống như trong google tài liệu)

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

Kết quả là (tách ra với những đường nét mới cho rõ ràng):

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

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

"phạm vi": "https://www.googleapis.com/auth/prediction",

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

"exp": 1340222315,

"iat": 1340218715}

cơ sở Phương thức mã hóa -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)); 
} 

Sau đó, tôi tạo một biển báo 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; 

Và sau đó hình thành các yêu cầu:

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); 

Và tất cả tôi nhận được là "Lỗi 400: Bad yêu cầu".

Các dữ liệu được mã hóa trông giống như (ngắt dòng thêm cho rõ ràng):

eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.

eyJpc3MiOiI0MjU0NjY3MTkwNzAtMWRnMnJlYnAwYThmbjlsMDJrOW50cjZ1NW80YThscDIuYXBwcy5nb29nbGV1c2VyY29udGVudC5jb20iLCJzY29wZSI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL2F1dGgvcHJlZGljdGlvbiIsImF1ZCI6Imh0dHBzOi8vYWNjb3VudHMuZ29vZ2xlLmNvbS9vL29hdXRoMi90b2tlbiIsImV4cCI6MTM0MDIyMjMxNSwiaWF0IjoxMzQwMjE4NzE1fQ.

lIFg7-Og_BcC5qpICLt7USwGIHUOz-vV4ADNq0AWhuRtsvFrbZn5mxk4n9r5qU66q4reTVVAtuW06DeGsdcBMNgEdIMvN6VuYQybs64p9mqrfECBYxO1FWHbUG-2On1IpowybEsRRUjZfp0jFuEY7SLE3XRaXan0k5zmejcvLQo

Tôi đã dành hai ngày cố gắng tìm ra những gì là sai nhưng tôi không thể nhìn thấy.

Ngoài ra, tôi không thể tìm thấy bất kỳ tài liệu và ví dụ phù hợp nào.

Tôi đang cố gắng nhận mã thông báo.

  1. Tôi có ký đúng byte không?
  2. Thông số "phạm vi" trong xác nhận quyền sở hữu trông như thế nào? Tôi đã thử "https://www.googleapis.com/auth/devstorage.readonly" và "https://www.googleapis.com/auth/prediction".
  3. Thông số "iss" nào phải bằng? Client-id hoặc địa chỉ e-mail? (đã thử cả hai)
  4. Các cách để tìm ra lỗi của tôi là gì?
  5. Có thư viện C# nào cho Ứng dụng Dịch vụ (không dành cho các ứng dụng đã cài đặt hoặc đăng nhập ứng dụng khách) không?

tôi nhận được điên ... Nó có để làm việc, nhưng nó không ...: -/

+0

Tôi đang gặp khó khăn trong quá trình triển khai xác thực tài khoản dịch vụ trong C#! Bạn có thể xác nhận với tôi rằng bạn đã sử dụng thành công các trường grant_type và assertion_type như chúng được hiển thị trong ví dụ của bạn không? cảm ơn – Nick

Trả lời

7

Giải pháp là trong mã yêu cầu tất cả các dấu gạch chéo phải được backslashed

sAI:

"scope":"https://www.googleapis.com/auth/prediction", 
"aud":"https://accounts.google.com/o/oauth2/token", 

ĐÚNG:

"scope":"https:\\/\\/www.googleapis.com\\/auth\\/prediction", 
"aud":"https:\\/\\/accounts.google.com\\/o\\/oauth2\\/token", 
+0

soulburner bạn là anh hùng của tôi! Cảm ơn bạn rất nhiều, tôi ước tôi có thể upvote 10 lần: D –

1

Tôi đã trả lời một câu hỏi tương tự với một đề nghị của một rất đơn giản nhưng thực hiện làm việc với .NET Google OAuth API here

Các vấn đề liên quan