我有:
我想在web应用上运行一个Cypress端到端的测试,它是通过我的IdentityServer使用授权代码流的登录页面来保护的。
我的理解是,Cypress无法再次导航到外部页面并返回,因此不可能模拟授权代码流。相反,我已经看到了如何auth0通过使用授予类型的密码来解决这一问题。的例子。
因此,我可以做类似的事情,在IdentityServer中将密码授予类型添加到客户端的授予类型中,然后让Cypress发出API请求并以这种方式检索ID和访问令牌吗?
如果是,我不确定如何通过Cypress将这些信息传递到我的应用程序中,这样BFF框架就能够像通过原始授权代码流那样使用这些代码。
如果有人已经解决了这些问题,或者有任何建议--谢谢。
发布于 2022-11-08 14:16:05
我会集中讨论以下问题:
因此,我可以做类似的事情,在IdentityServer中将密码授予类型添加到客户端的授予类型中,然后让Cypress发出API请求并以这种方式检索ID和访问令牌吗?
正如您所述--这需要启用授予密码。我有一个类似的Cypress测试,它对IdentityServer 4执行此操作(使用命令):
Cypress.Commands.add('identityServerGetAccessToken', (username, password, identityServerUrl) => {
var tokenEndpoint = identityServerUrl + 'connect/token'
return cy.request({
method: 'POST',
url: tokenEndpoint,
followRedirect: true,
form: true,
body: {
client_id: 'myclientid',
grant_type: 'password',
username: username,
password: password
}
});
});这将返回一个以响应作为参数的可链接的柏树链。在本例中,我检查我的api url是否返回401而不带访问令牌,返回200有。
let myApiUrl = 'http://myApiUrl';
describe('Api call requires access token tests', () => {
it('Call api - without access token - returns 401', () => {
cy.request({
url: myApiUrl,
failOnStatusCode: false
})
.its('status')
.should('eq', 401);
});
it('Call api - with access token - returns 200', () => {
cy
.identityServerGetAccessToken(username, password, identityServerUrl)
.then(response => {
var accessToken = response.body.access_token;
cy.request({
url: myApiUrl,
failOnStatusCode: false,
headers: {
authorization: 'Bearer ' + accessToken
}
})
.its('status')
.should('eq', 200);
});
});https://stackoverflow.com/questions/73962307
复制相似问题