ruby-on-rails - 如何在 Ruby on Rails 服务器上验证从 Android 发送的 Google token ID?

标签 ruby-on-rails ruby google-api ruby-on-rails-5 google-oauth

我有一个使用 Google 登录的 Android 应用程序。根据 documentation ,我生成了一个 token ID:

// Configure Google Sign-In with the requestIdToken

GoogleSignInOptions googleSignInOptions = new GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN)
                .requestIdToken(getString(R.string.server_client_id))
                .requestEmail()
                .build();

// Handle result

private void handleSignInResult(GoogleSignInResult result) {
    if (result.isSuccess()) {
        GoogleSignInAccount account = result.getSignInAccount();
        String tokenId = account.getIdToken();
    }
}

我在使用 Ruby on Rails 时遇到服务器端的问题。我正在尝试使用 google-id-token gem 。 README 给出了以下示例:

validator = GoogleIDToken::Validator.new(expiry: 1800)
begin
  payload = validator.check(token, required_audience, required_client_id)
  email = payload['email']
rescue GoogleIDToken::ValidationError => e
  report "Cannot validate: #{e}"
end

我有 token(来自 android java 代码)。什么是required_audience?我应该使用与我的客户端应用程序相同的 client_id 吗?当我尝试在服务器上运行代码时,我得到的负载为 nil

另外,我想知道这是否是验证 token ID 的正确方法。

最佳答案

经过一些研究,我找到了自己问题的答案。他们是:

什么是 required_audience?

可以从解码后的JWT字符串中获取。您可以按如下方式对其进行解码:

JWT.decode(token, nil, false)

我应该使用与客户端应用相同的 client_id 吗?

是的。 required_audiencerequired_client_id 应该相同。否则验证失败

那为什么我得到的负载为 nil

问题是,gem in GitHub与 RubyGems 中的不同。我通过将 Gemfile gem 指向 GitHub 解决了这个问题:

gem 'google-id-token', git: 'https://github.com/google/google-id-token.git'

关于ruby-on-rails - 如何在 Ruby on Rails 服务器上验证从 Android 发送的 Google token ID?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45262755/

相关文章:

ruby-on-rails - NilClass :Class using scopes 的 Ruby 错误未定义方法 `model_name'

get_video_info 的 YouTube 限制

ruby-on-rails - 无法安装 mysql2 0.3.14 gem

ruby-on-rails - 载波:将版本名称移到文件名的末尾,而不是前

javascript - Rails AJAX 请求 Controller 方法,然后调用 javascript 函数

android - 无法在 Android 模拟器上检索 OAuth 2.0 访问 token

google-api - 测试 Google 的 ClientLogin

ruby-on-rails - 抽取 Assets :precompile gets killed when there is a console session open in production

javascript - 仅在 AJAX 创建帖子后,link_to 没有路由匹配

python - 为什么 Ruby 的 Float#round 行为与 Python 不同?