我已经开始测试一个反应webapp但我没有走远,因为我遇到了登录问题.我正在使用cypress e2e测试工具.
将显示一个欢迎页面,其中包含一个要登录的按钮,该按钮将重定向到您的auth0
服务.用户使用电子邮件和密码登录,然后使用令牌重定向回webapp.
我尝试了许多不同的方法,导致了不同的问题.
注意:我不想测试Auth0,我只想输入我的webapp.
尝试1.单击登录按钮
尝试:赛普拉斯应该像用户一样做,因此测试将点击登录按钮并转到Auth0并填写凭据.问题:赛普拉斯不允许您在测试期间导航到其他域.
由于赛普拉斯更改了自己的主机URL以匹配您的应用程序的URL,因此它要求您的应用程序保留在同一个超级域中以进行单个测试.
您应该能够禁用该设置"chromeWebSecurity": false
,cypress.json
但它无法使用,因为您只能访问单个域cy.visit()
尝试2.从测试中以编程方式登录
尝试:使用auth0-js
库登录cypress测试,因此不需要单击登录按钮,因此不会发生域更改.
describe('Waiting to fetch', () => {
beforeEach(() => {
this.fetchAuthDeferred = getDeferred()
cy.visit('http://localhost:3000', {
onBeforeLoad(win) {
cy.stub(win, 'fetch')
.withArgs($url)
.as('fetchAuth')
.returns(this.fetchAuthDeferred.promise)
}
})
})
it('login', () => {
cy.visit('http://localhost:3000')
const auth = new auth0.WebAuth(authOptions)
auth.login(loginOptions)
cy.get('@fetchAuth', { timeout: 10000 }).should('haveOwnProperty', 'token')
cy.visit('http://localhost:3000')
cy.get('[class*="hamburger"]').click()
})
})
Run Code Online (Sandbox Code Playgroud)
问题:cy.route()
不等待获取请求,解决方法是使用cy.stub(win, 'fetch')
.它不会等待:
尝试3.从webapp以编程方式登录
尝试:我开始认为柏树只是从应用程序发出的间谍请求,而不是来自测试本身(正如我在上面的观点中所尝试的那样).
我在欢迎页面中添加了一个假登录按钮,该按钮将 …
auth0/auth0-angular
我正在尝试在 Angular 11 应用程序中使用该库。
我正在关注动态加载配置部分。
它提供了此示例应用程序模块代码:
// app.module.ts
// ---------------------------
import { AuthModule, AuthClientConfig } from '@auth0/auth0-angular';
// Provide an initializer function that returns a Promise
function configInitializer(
handler: HttpBackend,
config: AuthClientConfig
) {
return () =>
new HttpClient(handler)
.get('/config')
.toPromise()
.then((loadedConfig: any) => config.set(loadedConfig)); // Set the config that was loaded asynchronously here
}
// Provide APP_INITIALIZER with this function. Note that there is no config passed to AuthModule.forRoot
imports: [
// other imports..
HttpClientModule,
AuthModule.forRoot(), //<- …
Run Code Online (Sandbox Code Playgroud) 我试图让Auth0在浏览器中使用
离子运行浏览器
我遵循了Auth0的指南.我在用
auth0-7.6.1.min.js
锁定/ 10.10.2/lock.min.js
版本.导航到谷歌登录页面,但回调失败,空白屏幕.通过回电我的意思是加载
https://n00b.au.auth0.com/login/callback?state=blahblahblah ...
网址.它使用引发exeption的JavaScript加载白色html
没有找不到中继帧
在这些代码行中
onOpen: function(cb) {
var o = "*";
var msgTarget = isIE ? findRelay() : window.opener;
if (!msgTarget) throw "can't find relay frame";
Run Code Online (Sandbox Code Playgroud)
显然,一个全局的window.opener属性预计会存在.知道整个URL由Auth0提供,我无法找到解决问题的方法.
我已经检查过Auth0中的日志,从他们的角度来看它都是绿色的并显示成功登录.
任何想法为什么会失败?
更新:在iPhone和iOS模拟器上测试,两者都只显示空白屏幕.下载了示例Auth0项目,没有任何修改就有这个问题.我的猜测是它与Cordova的InApp Browser插件有关,在一个新的safari窗口中打开登录页面
我正在尝试实现 client_credentials 授予以在我的 Spring Boot 资源服务器中获取令牌。我使用Auth0作为授权服务器。他们似乎需要在请求正文中添加一个名为“audience”的额外参数。
我尝试通过邮递员提出请求并且它有效。我现在正尝试在 Spring 内重现它。这是工作邮递员的请求
curl -X POST \
https://XXX.auth0.com/oauth/token \
-H 'Content-Type: application/x-www-form-urlencoded' \
-d 'grant_type=client_credentials&audience=https%3A%2F%2Fxxxxx.auth0.com%2Fapi%2Fv2%2F&client_id=SOME_CLIENT_ID&client_secret=SOME_CLIENT_SECRET'
Run Code Online (Sandbox Code Playgroud)
我面临的问题是我无法将缺少的受众参数添加到令牌请求中。
我在 application.yml 中定义了一个配置
client:
provider:
auth0:
issuer-uri: https://XXXX.auth0.com//
registration:
auth0-client:
provider: auth0
client-id: Client
client-secret: Secret
authorization_grant_type: client_credentials
auth0:
client-id: Client
client-secret: Secret
Run Code Online (Sandbox Code Playgroud)
我的网络客户端过滤器是这样配置的。
@Bean
WebClient webClient(ReactiveClientRegistrationRepository clientRegistrations,
ServerOAuth2AuthorizedClientRepository authorizedClients) {
ServerOAuth2AuthorizedClientExchangeFilterFunction oauth2 = new ServerOAuth2AuthorizedClientExchangeFilterFunction(
clientRegistrations, authorizedClients);
oauth2.setDefaultClientRegistrationId("auth0");
return WebClient.builder()
.filter(oauth2)
.build();
}
Run Code Online (Sandbox Code Playgroud)
我正在注入实例并尝试发出请求以通过电子邮件获取用户
return this.webClient.get()
.uri(this.usersUrl + "/api/v2/users-by-email?email={email}", email)
.attributes(auth0ClientCredentials())
.retrieve()
.bodyToMono(User.class);
Run Code Online (Sandbox Code Playgroud)
按照我的理解,过滤器拦截此 userByEmail …
由于 PKCE 现在是隐式流程上推荐的授权方法,因此我正在寻找处理代码验证器的最佳实践以及如何完成此操作的建议。在高层 PKCE 授权流程中包括:
code_verifier
在客户端生成code_challenge
自 (1)/authorise
哪个code_challenge
重定向来选择 idp 并在回调中有一个code
code
(3) 中的 以及 来code_verifier
交换访问令牌问题是,在步骤 3 中,在应用程序重定向到授权服务器然后 idp 之前,必须将其存储code_verifier
在某处。那是在什么地方?
似乎像okta-oidc-js
存储code_verifier
在 sessionStorage 中的库。这不会让您遭受 XSS 攻击吗?即,如果我在应用程序进入授权流程并重定向之前将其存储code_verifier
在 sessionStorage 中,那么在回调中,什么会阻止某些 rouge 扩展从code
URL 和code_verifier
sessionStorage 读取?其组合可用于交换访问令牌。
我尝试使用auth0邮递员模板使用用户名和密码进行身份验证请求,我得到了一个unsupported grant type: password error
.我究竟做错了什么?
var client = new RestClient("https://test.auth0.com/oauth/token");
var request = new RestRequest(Method.POST);
request.AddHeader("postman-token", "abc");
request.AddHeader("cache-control", "no-cache");
request.AddHeader("content-type", "application/x-www-form-urlencoded");
request.AddParameter("application/x-www-form-urlencoded", "grant_type=password&client_id=foo&audience=&username=test&password=test&scope=openid%20email%20picture%20nickname", ParameterType.RequestBody);
Run Code Online (Sandbox Code Playgroud) 按照本Auth0文章中的说明,我使用"JWT"作为用户名并使用JWT令牌作为密码成功验证了MQTT客户端.
然而,在我的用例中,JWT令牌是短暂的.客户端必须在当前令牌的到期日期之前获取新令牌,然后将其提供给MQTT服务器.否则,服务器终止连接.
我的问题是:如何实现令牌更新?它是来自客户的发布消息吗?哪个主题?我是否断开客户端连接,并让客户端使用新令牌重新进行身份验证?或者还有另一种方式吗?
我正在使用用户在登录时提供的 auth0 令牌通过 useAuth0.getTokenSilently 进行 api 调用。
在此示例中fetchTodoList
,addTodoItem
、 和updateTodoItem
都需要令牌进行授权。我希望能够将这些函数提取到一个单独的文件中(例如utils/api-client.js
并导入它们而无需显式传入令牌。
import React, { useContext } from 'react'
import { Link, useParams } from 'react-router-dom'
import { FontAwesomeIcon } from '@fortawesome/react-fontawesome'
import { faCircle, faList } from '@fortawesome/free-solid-svg-icons'
import axios from 'axios'
import { queryCache, useMutation, useQuery } from 'react-query'
import { TodoItem } from '../models/TodoItem'
import { TodoInput } from './TodoInput'
import { TodoList as TodoListComponent } from './TodoList'
import { TodoListsContext } …
Run Code Online (Sandbox Code Playgroud) 我正在使用React创建一个前端,并使用Node创建后端.我想使用Auth0 Lock管理用户信息- 向API发送带有每个请求的JWT.
如果我需要做以下事情之一怎么办?
Auth0唯一标识符user_id
不是整数,因此不能用作ID /密钥.我如何在服务器端用户存储上处理这个问题?
我是否在每个API请求上阅读JWT,确定该用户是否存在,然后创建新用户(如果不存在),或者将其与预先存在的用户相关联.在每个API请求上检查用户数据库是否有效?
我不确定如何使用基于JWT的API和Auth0处理一般流程.
编辑:
经过一番研究和反思后我的想法:Auth0的唯一用户标识符由他们提供user_id
.这里的问题是它不是整数.因此,它不应该用作users
数据库中表的键.
看起来好像你不应该在每个请求上检查用户数据库,但这可能是不正确的.一个想法是在初始登录时回调到后端,如果该帐户不存在,则创建它,如果该帐户存在,则继续.然后在用户登录前端后,在每个后续请求中信任Auth0 JWT(如果它在后端验证).
从我在网上看到的这个过程的极少描述来看,我所描述的方式似乎是正常的方式.但在某些情况下它没有意义.如果用户被禁止怎么办?他们仍然可以使用活动的JWT访问服务器功能,直到它由于时间过期而到期.
因此,如果在每个API请求上检查用户存储是正常/高效的,那么如何将Auth0的字符串id user_id
与数据存储区中的整数ID相关联以进行查询?我正在使用SQL变体.
我已将我的应用程序从角度5升级到角度6.我现在收到以下错误.
Uncaught ReferenceError: global is not defined
at Object../node_modules/auth0-lock/lib/utils/cdn_utils.js (cdn_utils.js:13)
Run Code Online (Sandbox Code Playgroud)
"angular2-jwt":"^ 0.2.3","auth0-js":"^ 9.5.1","auth0-lock":"^ 11.6.1",
auth0 ×10
angular ×3
jwt ×2
reactjs ×2
axios ×1
cypress ×1
e2e-testing ×1
ionic2 ×1
javascript ×1
mocking ×1
mqtt ×1
node.js ×1
oauth ×1
oauth-2.0 ×1
pkce ×1
spring-boot ×1
testing ×1
typescript ×1