如何通过特定用户的 Bearer 令牌访问与 S3 Bucket 连接的 AWS CloudFront(JWT 自定义身份验证)

2023-11-24

我正在使用无服务器框架将无服务器堆栈部署到 AWS。我的堆栈由一些 lambda 函数、DynamoDB 表和 API 网关组成。

我使用所谓的 API 网关进行保护lambda 授权者。另外,我有一个可以生成令牌的自定义独立自托管身份验证服务。

因此,场景是用户可以从此服务(托管在 Azure 上的 IdentityServer4)请求令牌,然后用户可以使用不记名令牌向 API 网关发送请求,这样 API 网关将要求 lambda 授权者生成 iam 角色,如果令牌是正确的。所有这些都是有效的并且按预期工作。

以下是我的 serverless.yml 中 lambda 授权者定义的示例,以及我如何使用它来保护其他 API 网关端点:(您可以看到 addUserInfo 函数具有使用自定义授权者保护的 API)


functions:
    # =================================================================
    # API Gateway event handlers
    # ================================================================
  auth:
    handler: api/auth/mda-auth-server.handler

  addUserInfo:
     handler: api/user/create-replace-user-info.handler
     description: Create Or Replace user section
     events:
       - http:
           path: user
           method: post
           authorizer: 
             name: auth
             resultTtlInSeconds: ${self:custom.resultTtlInSeconds}
             identitySource: method.request.header.Authorization
             type: token
           cors:
             origin: '*'
             headers: ${self:custom.allowedHeaders}

现在我想扩展我的 API,以便允许用户添加图像,所以我遵循了这个approach。因此,在这种方法中,用户将启动所谓的签名 S3 URL,我可以使用此 S3 签名 URL 将图像放入我的存储桶中。

此外,S3 存储桶不可公开访问,但它连接到 CloudFront 分配。现在我错过了这里的东西,我不明白如何保护我的图像。无论如何,我可以使用自定义身份验证服务保护 CloudFront CDN 中的图像,以便拥有有效令牌的用户可以访问这些资源吗?如何使用自定义身份验证服务保护我的 CDN (CloudFront) 并使用无服务器框架进行配置?


这有点棘手,我需要大约一天的时间才能完成所有设置。

首先我们这里有选项:

  • 我们可以对 URL 进行签名并返回签名的 CloudFront URL 或签名的 S3 URL,而不是进行身份验证,这非常简单,但显然这不是我想要的。
  • 第二个选项是使用 Lambda@Edge 来授权 CloudFront 的请求,这就是我所遵循的。

因此,我最终创建了一个单独的堆栈来处理所有 S3、CloudFront 和 Lambda@Edge 内容,因为它们都部署在边缘上,这意味着该区域并不重要,但对于 lambda Edge,我们需要将其部署到主 AWS地区((弗吉尼亚北部),us-east-1)所以我最终为所有这些创建了一个堆栈。

首先,我的 auth-service.js 中有以下代码(这只是一些帮助程序,允许我验证我的自定义 jwt):

import * as jwtDecode from 'jwt-decode';
import * as util from 'util';
import * as jwt from 'jsonwebtoken';
import * as jwksClient from 'jwks-rsa';


export function getToken(bearerToken) {
    if(bearerToken && bearerToken.startsWith("Bearer "))
    {
        return bearerToken.replace(/^Bearer\s/, '');
    }
    throw new Error("Invalid Bearer Token.");
};

export function getDecodedHeader(token) {
        return jwtDecode(token, { header: true });
};

export async function getSigningKey(decodedJwtTokenHeader, jwksclient){
    const key = await util.promisify(jwksclient.getSigningKey)(decodedJwtTokenHeader.kid);
    const signingKey = key.publicKey || key.rsaPublicKey;
    if (!signingKey) {
        throw new Error('could not get signing key');
    }
    return signingKey;
  };

export async function verifyToken(token,signingKey){
    return await jwt.verify(token, signingKey);
};

export function getJwksClient(jwksEndpoint){
    return jwksClient({
        cache: true,
        rateLimit: true,
        jwksRequestsPerMinute: 10,
        jwksUri: jwksEndpoint
      });
};

然后在 serverless.yml 中这是我的文件:

service: mda-app-uploads

plugins:
  - serverless-offline
  - serverless-pseudo-parameters
  - serverless-iam-roles-per-function
  - serverless-bundle


custom:
  stage: ${opt:stage, self:provider.stage}
  resourcesBucketName: ${self:custom.stage}-mda-resources-bucket
  resourcesStages:
    prod: prod
    dev: dev
  resourcesStage: ${self:custom.resourcesStages.${self:custom.stage}, self:custom.resourcesStages.dev}


provider:
  name: aws
  runtime: nodejs12.x
  stage: ${opt:stage, 'dev'}
  region: us-east-1
  versionFunctions: true

functions: 
  oauthEdge:
    handler: src/mda-edge-auth.handler
    role: LambdaEdgeFunctionRole
    memorySize: 128
    timeout: 5


resources:
  - ${file(resources/s3-cloudfront.yml)}

快速要点在这里:

  • us-east-1 在这里很重要。
  • 使用无服务器框架创建任何 lambda 边缘有点棘手且不切实际,因此我用它来配置函数,然后在这个云形成模板中resources/s3-cloudfront.yml我添加了所有需要的部分。

那么这里的内容就是resources/s3-cloudfront.yml:

Resources:

    AuthEdgeLambdaVersion:
        Type: Custom::LatestLambdaVersion
        Properties:
            ServiceToken: !GetAtt PublishLambdaVersion.Arn
            FunctionName: !Ref OauthEdgeLambdaFunction
            Nonce: "Test"

    PublishLambdaVersion:
        Type: AWS::Lambda::Function
        Properties:
            Handler: index.handler
            Runtime: nodejs12.x
            Role: !GetAtt PublishLambdaVersionRole.Arn
            Code:
                ZipFile: |
                    const {Lambda} = require('aws-sdk')
                    const {send, SUCCESS, FAILED} = require('cfn-response')
                    const lambda = new Lambda()
                    exports.handler = (event, context) => {
                        const {RequestType, ResourceProperties: {FunctionName}} = event
                        if (RequestType == 'Delete') return send(event, context, SUCCESS)
                        lambda.publishVersion({FunctionName}, (err, {FunctionArn}) => {
                        err
                            ? send(event, context, FAILED, err)
                            : send(event, context, SUCCESS, {FunctionArn})
                        })
                    }

    PublishLambdaVersionRole:
        Type: AWS::IAM::Role
        Properties:
            AssumeRolePolicyDocument:
                Version: '2012-10-17'
                Statement:
                - Effect: Allow
                  Principal:
                    Service: lambda.amazonaws.com
                  Action: sts:AssumeRole
            ManagedPolicyArns:
            - arn:aws:iam::aws:policy/service-role/AWSLambdaBasicExecutionRole
            Policies:
            - PolicyName: PublishVersion
              PolicyDocument:
                Version: '2012-10-17'
                Statement:
                - Effect: Allow
                  Action: lambda:PublishVersion
                  Resource: '*'

    LambdaEdgeFunctionRole:
        Type: "AWS::IAM::Role"
        Properties:
            Path: "/"
            ManagedPolicyArns:
                - "arn:aws:iam::aws:policy/service-role/AWSLambdaBasicExecutionRole"
            AssumeRolePolicyDocument:
                Version: "2012-10-17"
                Statement:
                -
                    Sid: "AllowLambdaServiceToAssumeRole"
                    Effect: "Allow"
                    Action: 
                        - "sts:AssumeRole"
                    Principal:
                        Service: 
                            - "lambda.amazonaws.com"
                            - "edgelambda.amazonaws.com"
    LambdaEdgeFunctionPolicy:
        Type: "AWS::IAM::Policy"
        Properties:
            PolicyName: MainEdgePolicy
            PolicyDocument:
                Version: "2012-10-17"
                Statement:
                    Effect: "Allow"
                    Action: 
                        - "lambda:GetFunction"
                        - "lambda:GetFunctionConfiguration"
                    Resource: !GetAtt AuthEdgeLambdaVersion.FunctionArn
            Roles:
                - !Ref LambdaEdgeFunctionRole


    ResourcesBucket:
        Type: AWS::S3::Bucket
        Properties:
            BucketName: ${self:custom.resourcesBucketName}
            AccessControl: Private
            CorsConfiguration:
                CorsRules:
                -   AllowedHeaders: ['*']
                    AllowedMethods: ['PUT']
                    AllowedOrigins: ['*']

    ResourcesBucketPolicy:
        Type: AWS::S3::BucketPolicy
        Properties:
            Bucket:
                Ref: ResourcesBucket
            PolicyDocument:
                Statement:
                # Read permission for CloudFront
                -   Action: s3:GetObject
                    Effect: "Allow"
                    Resource: 
                        Fn::Join: 
                            - ""
                            - 
                                - "arn:aws:s3:::"
                                - 
                                    Ref: "ResourcesBucket"
                                - "/*"
                    Principal:
                        CanonicalUser: !GetAtt CloudFrontOriginAccessIdentity.S3CanonicalUserId
                -   Action: s3:PutObject
                    Effect: "Allow"
                    Resource: 
                        Fn::Join: 
                            - ""
                            - 
                                - "arn:aws:s3:::"
                                - 
                                    Ref: "ResourcesBucket"
                                - "/*"
                    Principal:
                        AWS: !GetAtt LambdaEdgeFunctionRole.Arn

                -   Action: s3:GetObject
                    Effect: "Allow"
                    Resource: 
                        Fn::Join: 
                            - ""
                            - 
                                - "arn:aws:s3:::"
                                - 
                                    Ref: "ResourcesBucket"
                                - "/*"
                    Principal:
                        AWS: !GetAtt LambdaEdgeFunctionRole.Arn

    
    CloudFrontOriginAccessIdentity:
        Type: AWS::CloudFront::CloudFrontOriginAccessIdentity
        Properties:
            CloudFrontOriginAccessIdentityConfig:
                Comment:
                    Fn::Join: 
                        - ""
                        -
                            - "Identity for accessing CloudFront from S3 within stack "
                            - 
                                Ref: "AWS::StackName"
                            - ""


    # Cloudfront distro backed by ResourcesBucket
    ResourcesCdnDistribution:
        Type: AWS::CloudFront::Distribution
        Properties:
            DistributionConfig:
                Origins:
                    # S3 origin for private resources
                    -   DomainName: !Sub '${self:custom.resourcesBucketName}.s3.amazonaws.com'
                        Id: S3OriginPrivate
                        S3OriginConfig:
                            OriginAccessIdentity: !Sub 'origin-access-identity/cloudfront/#{CloudFrontOriginAccessIdentity}'
                    # S3 origin for public resources           
                    -   DomainName: !Sub '${self:custom.resourcesBucketName}.s3.amazonaws.com'
                        Id: S3OriginPublic
                        S3OriginConfig:
                            OriginAccessIdentity: !Sub 'origin-access-identity/cloudfront/#{CloudFrontOriginAccessIdentity}'
                Enabled: true
                Comment: CDN for public and provate static content.
                DefaultRootObject: index.html
                HttpVersion: http2
                DefaultCacheBehavior:
                    AllowedMethods:
                        - DELETE
                        - GET
                        - HEAD
                        - OPTIONS
                        - PATCH
                        - POST
                        - PUT
                    Compress: true
                    TargetOriginId: S3OriginPublic
                    ForwardedValues:
                        QueryString: false
                        Headers:
                        - Origin
                        Cookies:
                            Forward: none
                    ViewerProtocolPolicy: redirect-to-https
                CacheBehaviors:
                    - 
                        PathPattern: 'private/*'
                        TargetOriginId: S3OriginPrivate
                        AllowedMethods:
                        - DELETE
                        - GET
                        - HEAD
                        - OPTIONS
                        - PATCH
                        - POST
                        - PUT
                        Compress: true
                        LambdaFunctionAssociations:
                            - 
                                EventType: viewer-request
                                LambdaFunctionARN: !GetAtt AuthEdgeLambdaVersion.FunctionArn
                        ForwardedValues:
                            QueryString: false
                            Headers:
                                - Origin
                            Cookies:
                                Forward: none
                        ViewerProtocolPolicy: redirect-to-https
                    - 
                        PathPattern: 'public/*'
                        TargetOriginId: S3OriginPublic
                        AllowedMethods:
                        - DELETE
                        - GET
                        - HEAD
                        - OPTIONS
                        - PATCH
                        - POST
                        - PUT
                        Compress: true
                        ForwardedValues:
                            QueryString: false
                            Headers:
                                - Origin
                            Cookies:
                                Forward: none
                        ViewerProtocolPolicy: redirect-to-https

                PriceClass: PriceClass_200

与此文件相关的一些要点:

  • 在这里,我创建了 S3 存储桶,其中将包含我的所有私有和公共资源。
  • 该存储桶是私有的且不可访问,您会发现一个角色只向 CDN 和 lambda 边缘提供对其的访问权限。
  • 我决定创建一个具有两个源的 CloudFront (CDN):public 指向 S3 的公共文件夹,private 指向 S3 的私有文件夹,并配置 CloudFront 私有源的行为以使用我的 lambda 边缘函数进行身份验证查看者请求事件类型。
  • 您还会发现用于创建函数版本的代码和另一个名为PublishLambdaVersion以其角色,它有助于在部署时为 lambda 边缘提供正确的权限。

最后,这是用于 CDN 身份验证的 lambda 边缘函数的实际代码:

import {getJwksClient, getToken, getDecodedHeader, getSigningKey, verifyToken} from '../../../../libs/services/auth-service';
import config from '../../../../config';

const response401 = {
    status: '401',
    statusDescription: 'Unauthorized'
};

exports.handler = async (event) => {
    try{
        const cfrequest = event.Records[0].cf.request;
        const headers = cfrequest.headers;
        if(!headers.authorization) {
            console.log("no auth header");
            return response401;
        }
        const jwtValue = getToken(headers.authorization);
        const client = getJwksClient(`https://${config.authDomain}/.well-known/openid-configuration/jwks`);
        const decodedJwtHeader = getDecodedHeader(jwtValue);
        if(decodedJwtHeader)
        {
          const signingKey = await getSigningKey(decodedJwtHeader, client);
          const verifiedToken = await verifyToken(jwtValue, signingKey);
          if(verifiedToken)
          {
            return cfrequest;
          }
      }else{
        throw Error("Unauthorized");
      }

    }catch(err){
      console.log(err);
      return response401;
    }
};

如果您感兴趣,我正在使用 IdentityServer4 并将其作为 Docker 映像托管在 Azure 中,并将其用作自定义授权者。

现在我们有了一个完全私有的 S3 存储桶,这是完整的场景。它只能通过 CloudFront 源进行访问。如果请求是通过公共源提供的,那么不需要身份验证,但如果它是通过私有源提供的,那么我将触发所谓的 lambda 边缘来对其进行身份验证并验证不记名令牌。

在深入了解所有这些内容之前,我对 AWS 堆栈完全陌生,但 AWS 非常简单,因此我最终以完美的方式配置了所有内容。如果有不清楚的地方或有任何疑问,请告诉我。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何通过特定用户的 Bearer 令牌访问与 S3 Bucket 连接的 AWS CloudFront(JWT 自定义身份验证) 的相关文章

  • 弹性豆茎领导者选举问题

    我们有一个 Rails 应用程序 几个月来一直运行良好 今天我们发现了领导人选举的一些不一致之处 主要是 su leader only bundle exec rake db migrate webapp 经过几个小时的反复试验 以及数十次
  • 使用 ALB 在 AWS 上部署 gRPC 支持应用程序

    我有两个使用 gRPC 进行通信的微服务 两者都是部署在 ECS 上的 docker 应用程序 如何配置它们以使用 AWS ALB 文档中说 ALB 支持 HTTP 2 但我只能看到 HTTP1 设置 我的应用程序有 1 个 gRPC 端口
  • 是否可以批量上传到亚马逊s3?

    亚马逊s3支持批量上传吗 我有一份工作 需要每天晚上上传约 100K 个文件 最大可达 1G 但严重偏向于小文件 90 小于 100 字节 99 小于 1000 字节长 s3 API 是否支持在单个 HTTP 调用中上传多个对象 所有对象必
  • 无法连接 AWS - RDS 数据库:SQL Server 2012 Express

    我是 AWS 世界的新手 我在访问 RDS US East 1a 上的 Microsoft SQL Server 2012 Express 11 00 5058 实例时遇到问题 当我创建数据库实例时 我能够访问它 创建一些表 传输数据等 一
  • Eloquent 使用远程 MySQL DB 花费太长时间

    我正在开发一个 Web Laravel 和 iOS 应用程序 它们都从我也在使用 Laravel 开发的 REST API 中使用 API 从 AWS RDS 实例托管的 MySQL 数据库进行查询 当我在本地主机上设置API和应用程序 并
  • 如何处理 AWS Redshift unload 命令中的带引号的值?

    假设 遵循AWS docs https docs aws amazon com redshift latest dg r UNLOAD command examples html我想使用像这样的卸载命令 unload SELECT FROM
  • 将 Python Lambda 函数导入 Eclipse AWS Toolkit

    如何将 Lambda 函数导入 AWS Toolkit for Eclipse 我将函数从 AWS 控制台导出到 YAML 和 ZIP 包 如何在 Eclipse 中使用这些内容 有教程数量 https cloudacademy com b
  • Kubernetes 在 AWS-EBS 上创建 PersistentVolumeClaim 失败

    我使用以下命令设置了一个包含四个 EC2 实例的 Kubernetes 集群kubeadm Kubernetes 集群工作正常 但当我尝试创建PersistentVolumeClaim 首先我创建了一个StorageClass使用以下 YA
  • 使用 authlogic-oauth2 服务器无法启动

    我已将 oauth2 和 authlogic oauth2 包含在 gemfile 中 因为我想使用它们并尝试启动服务器 它没有启动并给我错误 Library Ruby Gems 1 8 gems railties 3 0 3 lib ra
  • Amazon AWS IOS SDK:如何列出文件夹中的所有文件名

    我正在使用 AWS IOS SDK 并尝试列出文件夹中的所有文件 此代码用于列出 BUCKET 中的所有文件等 void s3DirectoryListing NSString bucketName s3Client AmazonS3Cli
  • Django CollectStatic 启动大文件上传时管道损坏

    我正在尝试使用collectstatic将静态文件上传到我的S3存储桶 但我收到一个700k javascript文件的管道损坏错误 这就是错误 Copying Users wedonia work asociados server aso
  • 用于拼出字母的 Alexa Skill 用户输入

    我希望 Alexa 能够接受我的自定义技能的可变长度英文字母列表 它将允许用户基于字符串进行搜索 有两个步骤 获得 Alexa 可以理解的单个字母的良好表示 枚举具有可变字母数的示例话语 对于第一种方法 一种方法是定义一个自定义槽 其枚举值
  • 自定义AWS ElasticBeanstalk NodeJS安装(使用yarn)

    是否可以配置 EBS 使用纱线包管理器而不是 NPM 安装我的 Node JS 应用程序 我已经找到了一个方法 但是有点hacky 创建一个 ebextensions yarn config file 名称不必是 yarn 将此内容放入文件
  • 如何通过内存监控EC2实例?

    使用 Cloudwatch 您可以通过多种标准监控您的 EC2 实例 例如网络使用情况 CPU 使用情况等等 不幸的是 没有内存消耗的指标 首先 出于好奇 我想知道 为什么 有人能解释一下为什么可以监控 CPU 使用情况 但不能监控内存使用
  • AWS Elasticbeanstalk 上的 ALLOW_ENCODED_SLASH

    我应该如何在 AWS 上配置 ElasticBeanstalk 以允许在 URL 中使用编码斜杠 使用 Dorg apache tomcat util buf UDecoder ALLOW ENCODED SLASH true 我在源包的顶
  • 将图像从 Stream/StreamReader 加载到 Image 或 RawImage 组件

    我正在使用 AWS Unity v3 3 50 0 从下载的 S3 SDK AWSSDK S3 3 3 5 4 unitypackage https aws amazon com mobile sdk https aws amazon co
  • CloudWatch 日志流到 Lambda python

    我已在 CloudWatch 日志组中创建了一个订阅过滤器 并将其流式传输到我的 lambda 函数 但我的 lambda 函数中出现错误 Code import boto3 import binascii import json impo
  • 跟踪 AWS ApiGateway 中的完整请求/响应正文(未截断)

    我正在使用 AWS Api Gateway 并且我想跟踪完整的请求和响应 我的一些集成是 lambda 和其他一些 http 端点 我启用了阶段 gt 日志 gt 记录完整请求 响应数据 我可以在 CloudWatch 上查看日志 这似乎很
  • 以编程方式发现 AWS DynamoDB 表的所有属性?

    我知道这可以通过全表扫描并检查所有记录是否存在属性来完成 有没有更痛苦的方法呢 不 没有 这是 DynamoDB 的权衡之一 如果有办法做到这一点 那么存储具有新属性的新项目就必须更新其他地方的其他内容 以记住表中存在的所有属性
  • 在 AWS ec2 实例上使用“sudo pip”时出现错误

    我正在尝试在 aws ec2 实例上运行一个小型 python 代码 需要 pytz 和其他一些包 当我尝试安装 pytz 时 出现一些错误 ec2 user ip 172 31 28 178 pip install pytz Collec

随机推荐

  • 使用导航图范围注入视图模型:NavController 在 onCreate() 之前不可用

    我在应用程序中使用导航组件 并在同一图中的多个片段之间使用共享 ViewModel 现在我想用这个图形范围实例化 ViewModelthis 如你所知 在碎片中我们应该注入对象 ViewModel etc onAttach 但是当我想这样做
  • 解析器错误恢复可以由语法自动引导吗?

    我正在编写一个 LALR 解析器生成器作为一个宠物项目 我使用紫龙书来帮助我进行设计 我从中了解到解析器中有四种错误恢复方法 恐慌模式 开始转储输入符号 直到找到编译器设计者预先选择的符号 短语级恢复 将输入字符串修改为允许当前产生减少的内
  • C# Picturebox透明背景似乎不起作用

    对于我的一个项目 我需要以透明背景显示图像 我制作了一些具有透明背景的 png 图像 为了检查这一点 我在 Photoshop 中打开了它们 现在我有一个扩展 PictureBox 的类 class Foo PictureBox publi
  • Pygame显示位置

    创建 pygame 窗口后我需要窗口位置 window pygame display set mode width height 0 32 pygame init 默认情况下 窗口从 0 0 开始 但如果用户更改窗口位置 我还需要 x y
  • 将多个水平 RecyclerView 一起滚动

    我正在创建一个类似于 EPG 的视图 其中我有多个水平视图RecyclerViews 如电视节目 封装在 LinearLayout 内 当我滚动 RecyclerView 之一时 我希望其余视图一起滚动 Override public vo
  • Java MongoDB 一次保存多个文档

    我有一个更新的对象 文档列表 我需要立即保存列表中的所有对象 我在 MongoTemplate 中看到 save 但它一次只能保存一个文档 有什么方法可以一次保存多个文档 或者我需要循环调用保存 您可以使用insertAll of Mong
  • 使用 URL 从 Firebase 存储中删除文件

    我正在尝试使用文件 URL 从 Firebase 存储中删除文件 我的问题是 getReferenceFromUrl 无法解决 示例代码在这里 StorageReference mStorageRef String storageurl h
  • Windows 下 MySQL 的自动补全

    有谁知道是否有办法让自动补全在 Windows 下的 MySQL 命令行客户端中工作 对我来说 它在 Linux 下工作得很好 但在 Windows 下只需移动光标即可 它应该这样工作 C gt mysql auto rehash 或者配置
  • 测试 3D 点是否位于 3D 多面体内部

    给定一个由三角网格表示的边界定义的 3D 多面体 如何实现一种算法来确定给定的 3D 点是否属于多面体的内部 有多种方法可以实现此功能 最简单的方法是创建一条从该点开始并指向任意方向的无限射线 或很长的线段 然后计算射线与三角形之间的交点数
  • Python:通过实例对象调用方法:“缺少 1 个必需的位置参数:'self'”[重复]

    这个问题在这里已经有答案了 我是Python新手 我编写了两个类 第二个类具有第一个类的实例作为成员变量 现在我想通过类 1 中的实例调用类 2 的方法 我找不到答案 像这样的东西 class Class1 def uselessmetho
  • Ant 脚本:防止 javac-classpath war-lib 中的 JAR 重复

    我有一个 ANT 脚本 并且有很多相同的 JAR 文件集的重复路径 但是类路径和战争元素中有很多双重措辞
  • 如何在 Google API NodeJS 客户端中使用 getClient() 时模拟管理员用户

    Per the 推荐在 defaultauth 示例中 我尝试访问已为其创建服务帐户的域的目录 api 这是我尝试连接的代码 import google from googleapis const authClient await goog
  • 在函数内将参数传递给 R 中的 lm

    我希望能够致电lm在函数内并指定weights变量作为参数传递给外部函数 然后传递给lm 下面是一个可重现的示例 其中如果调用lm在函数之外 但会产生错误消息Error in eval expr envir enclos object we
  • 代码优先参考一对多

    我有以下两个表 本土化 Id int Text string DINER Id int Name string Description string Name LocalizationID int Description LocationI
  • 使用 PHP 创建 SOAP 请求 - 如何向 XML 标记添加属性?

    我尝试在 SOAP 调用中生成以下 XML
  • Java7规范中的语法真的等效吗?

    语法在第18章JLS v7 的结构似乎与文档中其他地方的构造不同 但对我来说似乎存在差异 具体来说 第 15 章的规则是 RelationalExpression ShiftExpression RelationalExpression l
  • 状态 200 的 WebSocket 错误是什么?

    我购买了一个 WebSocket 模块并将其安装在我的 WAMP 环境中 我还有一个 PHP 脚本 它在正确的位置生成 IPC 文件并永远循环以侦听事件 但是 使用此客户端代码 var websocket null var connect
  • 使用 Neo4J 创建家谱

    我在 Neo4J 中有一组家谱数据 并且正在尝试构建一个 Cypher 查询来生成类似于以下内容的 JSON 数据集 Name Bob parents Name Roger parents Name Robert Name Jessica
  • 全高侧边栏和全高内容,流畅布局

    可能的重复没有帮助 我知道关于这个话题有很多答案 但它们都没有帮助我 我花了几天时间 这个问题 90 的答案和书籍都给出了这个背景技巧 但这对我没有帮助 我的代码 Plunker HTML h1 Hello Plunker h1 div c
  • 如何通过特定用户的 Bearer 令牌访问与 S3 Bucket 连接的 AWS CloudFront(JWT 自定义身份验证)

    我正在使用无服务器框架将无服务器堆栈部署到 AWS 我的堆栈由一些 lambda 函数 DynamoDB 表和 API 网关组成 我使用所谓的 API 网关进行保护lambda 授权者 另外 我有一个可以生成令牌的自定义独立自托管身份验证服