小编All*_*uan的帖子

访问令牌应该自动刷新还是手动刷新?

在过去的几天里,我一直在阅读有关使用刷新和访问令牌进行身份验证的内容,但这是我找不到答案的一件事。假设发送了过期的访问令牌。后端是否应该自动刷新它(如果提供了刷新令牌),或者刷新应该只在刷新端点完成?

作为示例,请考虑以下两个身份验证流程:

自动刷新

  1. 用户使用用户名和密码进行身份验证。API 发回一个包含其数据的短期访问令牌和一个长期刷新令牌。
  2. 对于每个需要身份验证/授权的请求,用户将在请求标头上发送两个令牌。
  3. 如果访问令牌已过期,API 将检查是否发送了有效的刷新令牌、该令牌是否处于活动状态以及它是否与访问令牌属于同一用户。如果一切看起来都不错,那么它将签署一个新的访问令牌并用它更新响应标头。

前端不必担心刷新令牌,但它仍然必须在每次请求后查找响应标头以检查是否发送了新令牌。

手动刷新

  1. 用户使用用户名和密码进行身份验证。API 发回一个包含其数据的短期访问令牌和一个长期刷新令牌。
  2. 对于每个需要身份验证/授权的请求,用户将发送他的访问令牌。
  3. 当访问令牌过期时,用户将其刷新令牌发送到路由refresh/。API 检查令牌是否有效。如果一切正常,它会返回一个新的访问令牌。

每次请求后,客户端都必须检查令牌是否过期,如果过期,则必须执行新请求来刷新令牌。正在向服务器发出更多请求,但另一方面,职责可以更好地分离,因为身份验证路由仅负责处理访问令牌,而刷新令牌处理则位于另一个路由中。

我很难找到有关该主题的资源,因此我不太确定哪种解决方案更好,或者即使我描述的解决方案完全正确。如果我必须选择一个,我会选择自动刷新,因为发出的请求更少,而且客户端可用性看起来更好,但正如我所说,我并不是 100% 同意这一点,因此我正在制作该线程。

访问令牌应该如何刷新?

authentication access-token oauth-2.0 refresh-token

12
推荐指数
3
解决办法
1万
查看次数

为什么我应该避免在 getter 和 setter 中包装字段?

我正在构建一个 Flutter 应用程序。我有一个看起来像这样的课程:

class ToDo {
    String _title;
    bool _done;

    String get title => _title;
    void set title(String newTitle) { _title = newTitle; }

    bool get _done => _done
    void set done(bool done) { _done = done; }
}
Run Code Online (Sandbox Code Playgroud)

但是 Dart linter 抱怨我应该“为了安全起见,避免在 getter 和 setter 中包装字段”。然而,这对我来说没有多大意义。现在 getter 没有用,但是如果将来我需要在从外部访问变量之前进行某种处理怎么办?我所要做的就是更新吸气剂。但是,如果属性是公开的并且可以直接访问,那么如果某些业务规则发生变化,我将不得不更新整个代码库。

那么这个警告有什么意义呢?或者,换句话说,为什么创建“无用的吸气剂”是一种不好的做法?

dart flutter

11
推荐指数
1
解决办法
5100
查看次数

Jest 不加载环境变量(即使使用 --setupFiles dotenv/config )

我正在为 Express 项目编写测试,但是当我运行测试脚本时,我的环境变量未加载。

在其他线程中,人们建议使用--setupFiles dotenv/config,我也这样做了,但不幸的是它不起作用。我尝试将其添加到我的测试脚本和文件中jest.config.js,但没有成功。有人对如何解决这个问题有任何提示吗?

语境

这就是我设置 jest 的方式package.json

"scripts": {
    "test": "jest --watchAll --setupFiles dotenv/config"
  },
"jest": {
    "testEnvironment": "node"
},
Run Code Online (Sandbox Code Playgroud)

在文件顶部app.js,我加载环境变量 require('dotenv').config();

这是我的文件夹结构:

项目的文件夹结构:一个源文件夹,其中包含多个文件夹,包括一个测试文件夹。 src 之外是 app.js、routes.js、.env、package.json 和其他一些文件

javascript node.js express jestjs dotenv

8
推荐指数
1
解决办法
6901
查看次数

如何设置使用 ngx-markdown 渲染的内容的样式?

我正在使用 Angular 构建一个博客,并且想使用 Markdown 创建我的帖子。我打算用ngx-markdown它来渲染它们。现在我正在创建一个“创建后”组件。问题是我想在降价上应用一些样式,但我不能。这是我的组件:

<div class="header-container">
  <h1 class="header">New post</h1>
  <button>Send</button>
</div>
<div class="main-container">
  <div class="post-editor">
    <label for="title">Title:</label>
    <input class="title-field" type="text" name="title"
      placeholder="E.g: Introduction to Programming" autocomplete="off"
      [(ngModel)]="post.title"
    >
    <textarea [(ngModel)]="post.content"></textarea>
  </div>
  <div class="post-preview">
    <markdown class="markdown" [data]="getPostAsString()" ngPreserveWhitespaces>
    </markdown>
  </div>
</div>
Run Code Online (Sandbox Code Playgroud)
import { Component, OnInit } from '@angular/core';

interface Post {
  title: string;
  content: string;
}

@Component({
  selector: 'app-create-post',
  templateUrl: './create-post.component.html',
  styleUrls: ['./create-post.component.css']
})
export class CreatePostComponent implements OnInit {
  post: Post = {
    title: 'Introduction to Programming', …
Run Code Online (Sandbox Code Playgroud)

css markdown angular

4
推荐指数
1
解决办法
3737
查看次数

如何删除AlertDialog中的空格?

我想显示一个 AlertDialog 来提示用户选择颜色。我做到了,但是,ColorPicker 和操作按钮之间有很多空白:

在此输入图像描述

如何删除空白并使对话框达到应有的大小?我尝试过使用 aDialog而不是 an AlertDialog,并将我的内容包装在 a 中ColumnmainAxisSize设置为MainAxisSize.min,但都不起作用。一件奇怪的事情是,传递给的值contentPadding似乎对 UI 没有影响。我尝试了不同的值,但它保持不变。

这是代码:

void _showColorPickerDialog() {
    showDialog(
        context: context,
        builder: (BuildContext context) {
          return AlertDialog(
            contentPadding: const EdgeInsets.all(6.0),
            title: Text('Pick a color'),
            content: MaterialColorPicker(),
            actions: [
              FlatButton(
                  child: Text('CANCEL', style: TextStyle(color: Colors.blue)),
                  onPressed: Navigator.of(context).pop),
              FlatButton(
                  child: Text('OK', style: TextStyle(color: Colors.blue)),
                  onPressed: Navigator.of(context).pop),
            ],
          );
        });
  }
Run Code Online (Sandbox Code Playgroud)

(Material ColorPicker) 包的作者提供了一些代码,展示了如何执行此操作,这与我的非常相似,但它也有同样的问题。可能我的Flutter版本和他的不一样。无论如何,你们知道有什么好的方法来解决这个问题吗?提前致谢。

dart flutter

3
推荐指数
1
解决办法
2658
查看次数

如何在 Cypress 中实现获取表格单元格的命令?

我想用这个界面创建一个命令:

cy.getTableCell({ column: 'Name', row: 42 }).contains('Douglas Adams')
Run Code Online (Sandbox Code Playgroud)

where将返回与表的第 42 行对应的getTableCell表单元格 ( ) 上的列。我想出了这个实现:td'Name'

type GetTableCellParams = {
  columnName: string;
  rowIndex: number;
};

Cypress.Commands.add(
  'getTableCell',
  ({ columnName, rowIndex }: GetTableCellParams) => {
    cy.contains('th', columnName)
      .invoke('index')
      .then((index) => {
        cy.get('tr')
          .eq(rowIndex)
          .within((row) => {
            return cy.get('td').eq(index);
          });
      });
  }
);
Run Code Online (Sandbox Code Playgroud)

它确实找到了正确的表格单元格。但是,由于它在回调中执行此操作,因此我无法对其执行任何操作 - 我希望能够调用可链接的方法,例如containsclick等。我如何重构它以便调用者可以访问此元素,能够调用containsclick和其他可链接的方法吗?

我还可以在函数可读性方面使用一些帮助。它看起来一团糟 - 我猜问题出在嵌套回调上......

cypress cypress-custom-commands

3
推荐指数
1
解决办法
501
查看次数

IllegalAccessException:无法访问类 C(在模块 M 中),因为模块 M 未将 C 导出到模块 N

我正在尝试将 Maven 支持添加到我现有的 JavaFX 项目中。

我首先遵循 OpenJFX 的入门指南,该指南教您如何使用 Maven 编译和运行 Hello World JavaFX 应用程序。完成后,我将项目的文件粘贴到这个新项目中并进行了所需的更改。我的文件夹结构或多或少是这样的:

src/main/
  java/
    org.openjfx/
      Main.java
      components/
      controllers/
  resources/org.openjfx/fxml/
Run Code Online (Sandbox Code Playgroud)

为了运行该项目,我使用以下 Maven 命令:

compiler:compile
javafx:compile
javafx:run
Run Code Online (Sandbox Code Playgroud)

但是,我收到此错误:

应用程序启动方法中的异常 原因:java.lang.IllegalAccessException:类 javafx.fxml.FXMLLoader$ValueElement (在模块 javafx.fxml 中)无法访问类 org.openjfx.controllers.LoginController (在模块 org.openjfx 中),因为模块 org. openjfx 不会将 org.openjfx.controllers 导出到模块 javafx.fxml

这看起来很奇怪,因为显然我正在导出以下内容module-info.java

src/main/
  java/
    org.openjfx/
      Main.java
      components/
      controllers/
  resources/org.openjfx/fxml/
Run Code Online (Sandbox Code Playgroud)

我想知道命名我的包是否org.openjfx是一个坏主意并且可能会导致问题,但我只是按照教程进行操作。

以下是我的pom.xml文件(如果有任何相关性):

compiler:compile
javafx:compile
javafx:run
Run Code Online (Sandbox Code Playgroud)

java javafx maven

1
推荐指数
1
解决办法
2668
查看次数

如何忽略 Joi 模式中的字段之一?

我的用户有以下 Joi 模式:

\n
const userRules = Joi.object({\n    name: Joi.string().pattern(new RegExp(\'^[A-Za-z\xc3\x81\xc3\x89\xc3\x8d\xc3\x93\xc3\x9a\xc3\xa1\xc3\xa9\xc3\xad\xc3\xb3\xc3\xba\xc3\xa3\xc3\xb5\xc3\x83\xc3\x95\xc3\xa2\xc3\xaa\xc3\xb4\xc3\x82\xc3\x8a\xc3\x94 ]+$\')).required(),\n    email: Joi.string().email().required(),\n    password: Joi.string().min(8).max(40).required()\n});\n
Run Code Online (Sandbox Code Playgroud)\n

但出于身份验证的目的,我只想验证emailpassword,忽略name。是否可以在不创建不同模式的情况下执行此操作?

\n

javascript joi

1
推荐指数
1
解决办法
3701
查看次数

与普通函数相比,Cypress 命令有何优势?

众所周知,在 Cypress 中我们可以在文件中定义自定义命令commands.js,语法如下:

Cypress.Commands.add('login', (email, pw) => {})
Cypress.Commands.overwrite('visit', (orig, url, options) => {})
Run Code Online (Sandbox Code Playgroud)

然后,这些命令将在我们的所有测试中可用,并且可以从cy对象中使用。

cy.login('my@email.com', '123456')
cy.visit('www.stackoverflow.com', 'www.google.com', { redirect: true })
Run Code Online (Sandbox Code Playgroud)

但我不明白它的要点。当你可以编写一个常规函数时,这样做有什么意义呢?

function login(email, pw) { /* ... */ }

login('my@email.com', '123456')
Run Code Online (Sandbox Code Playgroud)

我看到的唯一优点是使该函数在任何地方都可用,而无需导出/导入它,但您也可以使用全局变量来做到这一点。是这样吗,还是我错过了什么?

cypress

1
推荐指数
1
解决办法
858
查看次数

是否可以强制类型转换?

我正在使用一个 API,该 API 公开了一个方法,该方法可以从两个不同的类之一返回一个对象,比如说,Car或者Bike. 也就是说,该方法将具有以下签名:

getVehicle(): Car | Bike

现在假设在特定情况下,我确定此方法将返回Car,因此我可以调用getVehicle().fillTank(),该方法仅在Car. 但是 TypeScript 不会让我这样做,因为它认为这个对象也可能是一个Bike,在这种情况下它不会有fillTank()方法。

它不会让我投来Car既,如const car: Car = getVehicle();因为某些Car的属性中缺少Bike。这个问题有什么解决方法吗?

typescript

0
推荐指数
1
解决办法
46
查看次数