Как получить код авторизации сервера от входа в Google - PullRequest
0 голосов
/ 30 ноября 2018

Есть два клиента, которых я хочу авторизовать с помощью моего django-сервера.Оба позволяют Google войти в систему.

В Swift я могу добавить как clientID, так и serverClientID, а затем я получаю код авторизации:

extension AppDelegate: GIDSignInDelegate {
    func sign(_ signIn: GIDSignIn!, didSignInFor user: GIDGoogleUser!,
              withError error: Error!) {
        if not let error = error {
          else {
            if let code = user.serverAuthCode {
                RESTService.request(to: "user/google_login", via: .post, with: [
                    "code": code
                ], { json in
                    print(json)
                }
            }
        }
    }
}

/api/user/google_login - этопсевдоним для django-rest-social-auth /api/login/social/session/ с уже установленным провайдером.
Это отлично работает.Пользователь вошел в систему, все довольны.

На веб-клиенте, однако, я не смог найти опцию для добавления ключа сервера (в документации ).И если я просто использую ключ веб-клиента, авторизация сервера завершится неудачно:

`
401 Client Error: Unauthorized for url: https://accounts.google.com/o/oauth2/token
Your credentials aren't allowed
`

Реализация веб-клиента отражает код Swift:

function renderButton() {
  gapi.load('auth2', function () {
    auth2 = gapi.auth2.init({
      client_id: CLIENT_ID,
      // I tried specifying `server_id: SERVER_ID,` but that didnt change anything
    });
    $(document).on('click', '#my-signin2', function () {
      auth2.grantOfflineAccess().then(signInCallback);
    });
  });
}

function signInCallback(authResult) {
  if (authResult['code']) {
    // Logged into your app and Google.
    postJSON("/api/user/google_login/", {
      "code": authResult['code']
    }, postReload);
  } else {
    // There was an error.
  }
}

Выполняется сообщение JSON, и сервер выполняетсязавершается с указанной выше ошибкой и возвращает 400.

Я полагаю, это потому, что запрос от клиента не включает ключ сервера.Поэтому, когда сервер вызывает API Google для получения токена, он отклоняется, потому что ключ неизвестен.

Как я могу выполнить действительный запрос (как в Swift) от JS?

...