2014-04-03 16 views
6

Tôi đã bắt đầu quá trình Di chuyển từ Google OpenID sang OpenID Connect bằng OAuth 2.0 theo những gì được trình bày trong Documentation. Tôi có thể hoàn thành thành công quy trình truy xuất openid_id và sub bên trong id_token từ điểm cuối mã thông báo, nhưng khi tôi thực hiện, openid_id không khớp với số nhận dạng hiện có mà chúng tôi có trong hệ thống của mình. Ngăn tôi lập bản đồ người dùng hiện tại với ID mới và ngăn người dùng đăng nhập vào ứng dụng của chúng tôi (hoặc có thể được phép đăng nhập với tư cách người khác). id có định dạng chính xác nhưng không khớp.Di chuyển Google OpenID sang OpenID Connect: openid_id không khớp với

Tôi đã đặt tham số openid.realm thành openid.realm hiện tại của chúng tôi cũng như đặt chuyển hướng giống như đề xuất của tài liệu. Điều này đang xảy ra cả ở địa phương và trong môi trường được lưu trữ thông thường của chúng tôi. Tôi đang sử dụng JWT.JsonWebToken để giải mã id_token nhưng tôi cũng đã xác minh rằng nó đã được giải mã đúng cách bằng cách sử dụng bộ giải mã lưu trữ trên web trên google: JWT Decoder và tôi đã tìm ra cùng một Mã định danh OpenID không khớp với số mà chúng tôi hiện có cho người dùng đó. Tôi cũng nên lưu ý rằng tôi đã thử thêm phạm vi hồ sơ là tốt nhưng điều đó đã không làm cho bất kỳ sự khác biệt.

Chúng tôi đang sử dụng DotNetOpenAuth.OpenId cho hệ thống ban đầu của chúng tôi, vì vậy tôi không nghĩ rằng vấn đề nằm ở đó. Tôi đã kiểm tra ClaimedIdentifier là một phần của phản hồi và nó khớp với những gì chúng tôi lưu trong hệ thống của chúng tôi cho openId vì vậy chúng tôi không lưu nó không chính xác.

Dưới đây là những gì chúng tôi sử dụng để tạo Uri cho yêu cầu xác thực. Nó chủ yếu là phiên bản được sửa đổi của ứng dụng khách DotNetOpenAuth.GoogleOAuth2.

protected static Uri GetServiceLoginUrl(Uri returnUrl) 
    { 
     var state = string.IsNullOrEmpty(returnUrl.Query) ? string.Empty : returnUrl.Query.Substring(1); 

     return BuildUri(AuthorizationEndpoint, new NameValueCollection 
      { 
       { "response_type", "code" }, 
       { "client_id", AppId }, 
       { "scope", "openid" }, 
       { "prompt", "select_account"}, 
       { "openid.realm", CloudServiceConfiguration.GetDNSName() }, 
       { "redirect_uri", returnUrl.GetLeftPart(UriPartial.Path) }, 
       { "state", state }, 
      }); 
    } 

private static Uri BuildUri(string baseUri, NameValueCollection queryParameters) 
     { 
      var q = HttpUtility.ParseQueryString(string.Empty); 
      q.Add(queryParameters); 
      var builder = new UriBuilder(baseUri) { Query = q.ToString() }; 
      return builder.Uri; 
     } 

Và đây là những gì chúng tôi sử dụng để tạo ra các yêu cầu đến thiết bị đầu cuối token.

protected static Tuple<string, string> GetAuthTokens(Uri returnUrl, string authorizationCode) 
    { 
     var postData = HttpUtility.ParseQueryString(string.Empty); 
     postData.Add(new NameValueCollection 
      { 
       { "grant_type", "authorization_code" }, 
       { "code", authorizationCode }, 
       { "client_id", AppId }, 
       { "client_secret", AppSecret }, 
       { "redirect_uri", returnUrl.GetLeftPart(UriPartial.Path) }, 
      }); 

     var webRequest = (HttpWebRequest)WebRequest.Create(TokenEndpoint); 

     webRequest.Method = "POST"; 
     webRequest.ContentType = "application/x-www-form-urlencoded"; 

     using (var s = webRequest.GetRequestStream()) 
     using (var sw = new StreamWriter(s)) 
      sw.Write(postData.ToString()); 

     using (var webResponse = webRequest.GetResponse()) 
     { 
      var responseStream = webResponse.GetResponseStream(); 
      if (responseStream == null) 
       return null; 

      using (var reader = new StreamReader(responseStream)) 
      { 
       var response = reader.ReadToEnd(); 
       var json = JObject.Parse(response); 
       var accessToken = json.Value<string>("access_token"); 
       var idToken = json.Value<string>("id_token"); 
       return new Tuple<string,string>(accessToken,idToken); 
      } 
     } 
    } 
+0

Sử dụng ở trên Tôi gặp sự cố khi không có mã thông báo mở đang được trả lại trong dữ liệu bổ sung. Làm thế nào bạn có được điều này để trở về? – Doug

Trả lời

3

Hãy chắc chắn rằng bạn sử dụng CHÍNH XÁC giá trị openid.realm cùng trong quá trình chuyển chảy như bạn sử dụng trong OpenID2 ban đầu chảy: bất kỳ không phù hợp trong những giá trị (thậm chí là một thiếu trailing slash char) sẽ dẫn đến các giá trị mã định danh mở hoàn toàn khác nhau.