Google+ API会同时登录Android应用和服务器

时间:2014-11-27 11:45:16

标签: android oauth google-api

我的应用有一个Android客户端与我自己的后端服务器通信。我想使用Google API来处理用户授权(使用Google+帐户),这样用户就无需为我的应用注册单独的帐户。

通过遵循https://developers.google.com/+/web/signin/server-side-flow中的文档,我对身份验证流程的理解如下所示。我不确定它是否正确,因为它听起来像是为了我的目的而劫持Google API。

  1. Android上的用户登录
  2. Android客户端获取一次性访问代码并将其发送到我的服务器。
  3. 我的服务器交换刷新令牌和访问令牌。 (如果交换成功,则对用户进行身份验证。)
  4. 如果用户通过身份验证,我会在服务器上生成访问令牌并将其提供给Android客户端。 Android客户端随后可以使用该令牌来调用我的服务器的API。
  5. 特别是,我对第3点表示怀疑。我交换了Google刷新令牌和访问令牌的访问代码,但我从不使用它们。交换的目的只是检查用户是否已获得Google的授权。听起来是否正确?如果没有,这样做的好方法是什么?

1 个答案:

答案 0 :(得分:1)

在服务器上收到 access_token 后,请执行对Google服务器的cURL /网络请求。

例如(在PHP中):

<?php

    $access_token = $_GET['access_token']; // Get the access token

    $google_api_url = "https://www.googleapis.com/plus/v1/people/me?access_token=". $access_token; // Create Google API URL with access_token

    $c = curl_init($google_api_url); // Create network request to the Google server

    curl_setopt($c, CURLOPT_RETURNTRANSFER, true);

    $result = curl_exec($c); // Execute request and get the response from th Google server

    var_dump($result); // Print the result

RESULT OUTPUT(以JSON格式):

如果access_token 有效

{
    "kind": "plus#person",
    "gender": "male",
    "emails": [
        {
            "value": "arr.mohd@gmail.com",
            "type": "account"
        }
    ],
    "objectType": "person",
    "id": "101571740244190011262",
    "displayName": "Rafique Mohammed",
    "name": {
     "familyName": "Mohammed",
     "givenName": "Rafique"
    },
    "url": "https://plus.google.com/101571740244190011262",
    "image": {
     "url": "https://lh6.googleusercontent.com/-pxiRX5gNkWE/AAAAAAAAAAI/AAAAAAAAAEg/99WWMsH16P8/photo.jpg?sz=50",
     "isDefault": false
    },.... //etc

如果access_token 无效

{
    "error": {
        "errors": [
            {
                "domain": "global",
                "reason": "authError",
                "message": "Invalid Credentials",
                "locationType": "header",
                "location": "Authorization"
            }
        ],
        "code": 401,
        "message": "Invalid Credentials"
    }
 }