2016-04-22 14 views
6

Người dùng ủy quyền trong ứng dụng Android của tôi. Và tôi đang gửi mã thông báo của người dùng và thông tin khác đến máy chủ của tôi. Tại máy chủ này, tôi muốn thực hiện một số logic cho người dùng.Làm cách nào để có thể tiếp cận thông tin lịch của người dùng trên máy chủ?

Tôi muốn có chính xác this flow.

Tôi đã làm theo các bước quickstart.php in this link để nhận lịch của người dùng trên máy chủ.

Nhưng tôi nhận được lỗi sau:

google oauth exception' with message 'could not json decode the token'

Vì lý do này tôi đã cố gắng this solution. Nhưng tôi cũng gặp lỗi tương tự. Vì vậy, như là tùy chọn thứ 3 tôi tạo ra các định dạng json bản thân mình như trong this solution như dưới đây.

$access_token = '{ 
    "access_token":'.$access_token.', 
    "token_type":"Bearer", 
    "expires_in":3600, 
    "id_token":'.$id_token.', 
    "refresh_token":" ", 
    "created":'. time() .' 
}'; 

như bạn thấy Tôi không biết cách trao đổi mã thông báo làm mới. Tôi đã tìm kiếm cách nhận mã thông báo làm mới và thấy this question. Và triển khai this solution vào mã của tôi nhưng không có gì thay đổi.

Chỉnh sửa 4: Tôi đã cố gắng lấy mã thông báo truy cập according to this answer tại ứng dụng Android và gửi tới máy chủ ứng dụng. Tôi đang tham gia các mã như trước đây tôi đã làm:

GoogleSignInAccount acct = result.getSignInAccount(); 
code = acct.getServerAuthCode();//sending this code to AsyncTask to get access token 

chức năng của tôi để có được truy cập Mã:

private void getAccessToken()throws GoogleAuthException, IOException{ 
    new AsyncTask<Void, Void, String>() { 
     @Override 
     protected String doInBackground(Void... params) { 
      List<String> scopes = new LinkedList<String>(); 
       scopes.add("https://www.googleapis.com/auth/calendar"); 
       scopes.add("https://www.googleapis.com/auth/calendar.readonly"); 
       scopes.add("https://www.googleapis.com/auth/urlshortener"); 

       GoogleAuthorizationCodeFlow flow = new GoogleAuthorizationCodeFlow.Builder(transport, jsonFactory, client_id, client_secret, scopes).build(); 

       try{ 
        GoogleTokenResponse res = flow.newTokenRequest(code).execute(); 
        accessToken = res.getAccessToken(); 
       }catch(IOException e){ 
       } 

ở phía php máy chủ tôi đã thay đổi user-example.php tập tin chút như dưới đây bởi vì tôi có access token bây giờ:

$client = new Google_Client(); 
$client->setClientId($client_id); 
$client->setClientSecret($client_secret); 
$client->setAccessType("offline"); 
$client->setRedirectUri($redirect_uri); 
$client->addScope("https://www.googleapis.com/auth/urlshortener"); 
$service = new Google_Service_Urlshortener($client); 
if (isset($_REQUEST['logout'])) { 
    unset($_SESSION['access_token']); 
} 
$client->setAccessToken('{"access_token":"'. $access_token .'","token_type":"Bearer","expires_in":3600,"created":'. time() .'}'); 
if ($client->getAccessToken() && isset($_GET['url'])) { 
$url = new Google_Service_Urlshortener_Url(); 
$url->longUrl = $_GET['url']; 
$short = $service->url->insert($url); 
$_SESSION['access_token'] = $client->getAccessToken(); 

Nhưng bây giờ tôi nhận được dưới đây lỗi:

Fatal error: Uncaught exception 'Google_Service_Exception' with message 'Error calling POST https://www.googleapis.com/urlshortener/v1/url : (403) Insufficient Permission' in C:\wamp\www\google-php\src\Google\Http\REST.php on line 110

+0

Các biến trong dấu nháy đơn không được đánh giá. Break mở chuỗi cho các biến. '$ sp = 'hi i am'. $ name. ' và tôi viết các chuỗi. '; ' –

+0

Tôi vẫn gặp lỗi giải mã json tương tự. : \ – melomg

+0

Nếu hai mã thông báo này không phải là số nguyên, hãy đặt chúng thành dấu ngoặc kép. –

Trả lời

2

Tôi đã nhận được lỗi Không đủ quyền sau khi tôi bắt đầu sử dụng GoogleAuthorizationCodeFlow để nhận mã thông báo truy cập như tôi đã đề cập trong OP của tôi. Và sau đó tôi đã cố gắng thêm phạm vi Lịch vào GoogleApiClient.Builder(this) nhưng tôi nhận được lỗi như tôi không thể thêm phạm vi nếu tôi thêm Auth.GOOGLE_SIGN_IN_API vì tôi đã thêm Auth.GOOGLE_SIGN_IN_API vào GoogleApiClient.Builder. Vì vậy, lần này tôi đã cố gắng thêm phạm vi vào GoogleSignInOptions.Builder và nó đang hoạt động ngay bây giờ. Tôi có thể nhận cả mã thông báo làm mới và mã thông báo truy cập. Mã dưới đây đã giải quyết được sự cố của tôi:

GoogleSignInOptions gso = state.getGso(); 
if(gso == null){ 
    gso = new GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN) 
     .requestScopes(new Scope("https://www.googleapis.com/auth/calendar")) 
     .requestIdToken(getString(R.string.server_client_id)) 
     .requestEmail() 
     .requestServerAuthCode(getString(R.string.server_client_id), false) 
     .requestProfile() 
     .build(); 
} 
+0

Xin chào! Xin vui lòng giúp tôi với google đăng xuất? Tôi nghĩ bạn phải triển khai nó trong ứng dụng của mình nếu bạn làm việc với googleAuth ... Tôi có vấn đề như vậy, tôi đã thực hiện đăng nhập trong hoạt động đầu tiên, nhưng nút LogOut tôi đã triển khai trên một hoạt động khác và sau đó nếu tôi nhấp vào nút này, tôi gọi 'Auth. GoogleSignInApi.revokeAccess (mGoogleApiClient) 'và nhận được lỗi 'GoogleApiClient chưa được kết nối .' theo như tôi hiểu, tôi nhận được nó vì nó là thực thể khác nhau khi tôi đăng nhập và đăng xuất ... nhưng làm cách nào tôi có thể lưu thực thể? Bạn đã triển khai cách nào trong ứng dụng của mình? –

+0

Tôi không thể kiểm tra dự án vì hiện tại tôi không có máy chủ. Và theo như tôi hiểu từ mã của tôi: D, tôi nhớ lại hoạt động đăng nhập bằng cờ khác và hoạt động đăng nhập tại hàm onConnected Tôi đang kiểm tra cờ này. Nếu cờ là đúng, tôi chỉ cần gọi hàm 'Auth.GoogleSignInApi.signOut' bằng cách đặt lại gọi lại kết quả. Nhưng tôi khá chắc chắn đây không phải là một cách hay để đạt được mục tiêu này. Ngoài ra còn có nhiều cách để lưu trữ một giá trị là toàn cầu. Bạn có thể xem [liên kết này] (http://stackoverflow.com/a/1945297/3918109) và sau khi bạn nhận được đối tượng 'mGoogleApiClient', bạn có thể kiểm tra xem nó có được kết nối hay không. – melomg

+0

như xa như tôi nhớ 'onConnected()' phương pháp đã được cung cấp trong ver trước google auth ... trong thực hiện cuối cùng nó là một số sự khác biệt ... tôi không có phương pháp này trong thực hiện của tôi (nhưng tôi nhận được quan điểm của bạn –

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