当前位置: 首页 > 知识库问答 >
问题:

使用谷歌云验证本地Spring Boot服务

暨正真
2023-03-14

我有一个可以在本地服务器(而不是谷歌云服务器)上运行的Spring启动应用程序。我计划使用服务号来允许应用程序使用谷歌云存储和日志记录。我创建了一个服务号和一个api密钥,并下载了如下所示的json文件:

{
  "type": "service_account",
  "project_id": "...",
  "private_key_id": "....",
  "private_key": "-----BEGIN PRIVATE KEY-----\n....\n-----END PRIVATE KEY-----\n",
  "client_email": ".....iam.gserviceaccount.com",
  "client_id": ".....",
  "auth_uri": "https://accounts.google.com/o/oauth2/auth",
  "token_uri": "https://oauth2.googleapis.com/token",
  "auth_provider_x509_cert_url": "https://www.googleapis.com/oauth2/v1/certs",
  "client_x509_cert_url": "https://www.googleapis.com/robot/v1/metadata/x509/....."
}

如果我在开发环境中启动应用程序,并设置一个指向json文件的环境变量,应用程序就会按预期工作(GOOGLE\u APPLICATION\u凭据)。

但是,我需要在ubuntu中将应用程序作为init. d服务运行(应用程序配置为作为可执行jar运行)。我像这样将我的jar文件安装为服务:

sudo ln -s /home/<user>/<jarname>.jar /etc/init.d/<service-name>
sudo chmod +x /etc/init.d/<service-name>
sudo update-rc.d <service-name> defaults
sudo service <service-name> start

初始化。d服务将看不到我设置的环境变量,因此我需要以另一种方式进行身份验证。

我安装了gcloud,并设置了如下服务帐户:

gcloud auth activate-service-account service-account-name@project-name.iam.gserviceaccount.com --key-file=credentials.json
gcloud config set project <projectId>

我还运行了gclout init,它显示了我添加的服务帐户。

当我运行应用程序时,会出现多个错误:com.google.应用程序编程接口。gax。rpc。PermissionDeniedException:io。grpc。StatusRuntimeException:权限被拒绝:请求缺少有效的API密钥 。看起来好像少了什么,但我不知道是什么。

我的回归Spring。xml:

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
    <include resource="org/springframework/cloud/gcp/autoconfigure/logging/logback-appender.xml" />
    <include resource="org/springframework/boot/logging/logback/defaults.xml" />
    <include resource="org/springframework/boot/logging/logback/console-appender.xml"/>

    <appender name="CLOUD" class="com.google.cloud.logging.logback.LoggingAppender">
        <!-- Optional : filter logs at or above a level -->
        <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
            <level>INFO</level>
        </filter>
        <log>application.log</log> <!-- Optional : default java.log -->
        <!--resourceType>gae_app</resourceType--> <!-- Optional : default: auto-detected, fallback: global -->
        <loggingEventEnhancer>....LoggingEventEnhancer</loggingEventEnhancer>
        <flushLevel>INFO</flushLevel> <!-- Optional : default ERROR -->
    </appender>


    <root level="INFO">
        <!-- If running in GCP, remove the CONSOLE appender otherwise logs will be duplicated. -->
        <appender-ref ref="CONSOLE"/>
        <appender-ref ref="CLOUD"/>

    </root>
</configuration>

运行gCloud日志接收器列表在服务器上运行正常,因此权限应该是正确的。

我知道spring.cloud.gcp.credentials.location=file:/...,但它不适合我。(还有,这个:https://github.com/spring-cloud/spring-cloud-gcp/issues/315#issuecomment-359077878)


共有1个答案

金晨
2023-03-14

我使用systemd,它允许我在服务启动时设置任何环境变量

  1. 放置可执行jar和应用程序。文件夹中的属性,例如/
[Unit]
Description=Description text...etc
Wants=network-online.target
After=network.target network-online.target

[Service]
Environment="LOGPATH=/var/<name>/logs"
Environment="GOOGLE_APPLICATION_CREDENTIALS=/path-to-google-json/google/credentials.json"
ExecStartPre=/bin/mkdir -pm 0755 ${LOGPATH}
ExecStart=/opt/<name>/<jar-name>.jar
PIDFile=/run/<name>/<name>%i.pid
Restart=on-abort
RuntimeDirectory=<name>
RuntimeDirectoryMode=755
WorkingDirectory=/opt/<name>

[Install]
WantedBy=multi-user.target

状态:sudo systemctl状态

遵循标准:sudo-journalctl-u

 类似资料:
  • 我正在遵循官方的Google身份验证流程。我的应用程序已经使用了最新版本的Google地图。 项目 应用程序 地图下方有一条红线,弹出窗口显示找到了11.8.0和11.4.2。构建错误消息如下:, 错误:任务“:应用程序:进程”的执行失败。 请通过更新谷歌服务插件的版本来修复版本冲突(有关最新版本的信息,请访问https://bintray.com/android/android-tools/co

  • 我得到例外: 签名异常java.security.signatureException:签名长度不正确:得到294,但预期为256 因此,我成功地生成了bu在: 参考:谷歌播放订单ID更新为新格式 DefaultSignatureValidator.class: 有什么想法如何验证它吗?

  • 我尝试过将deendpoint与云SQL和Hibernate集成。但是,每次都有错误。跟随我的测试: 1 -源文件夹中的persistence . XML:http://imgur.com/hKjf8Cs给我错误:http://imgur.com/QJe8rvq 2-资源文件夹中的persistence.xml给我错误: ServletInitializationParameters.java:5

  • 我建立Android应用程序链接到谷歌云存储。我想允许访问GCS到我的Android应用程序只。 谷歌提供三种安全连接地面军事系统的解决方案: Oauth 2.0(谷歌账户也是如此) 资料来源:https://developers.google.com/storage/docs/authentication?hl=FR 是否有其他通过地面军事系统安全连接的解决方案?我希望通过这种方式在地面军事系统

  • 我有一个谷歌办公套件电子邮件地址example@gmail.com我创建了一个谷歌服务号example-sa@iam.gserviceaccount.com。 我的目标是从这个SA发送电子邮件,就像它是电子邮件一样,但我无法验证SA。 不过,我可以使用以下代码登录服务帐户Google Drive: 然而,当我尝试为gmail做同样的事情时,我得到了一个错误: 错误: 如果我点击错误消息中提供的UR