mirror of
https://github.com/logto-io/logto.git
synced 2024-12-30 20:33:54 -05:00
fix(github): fix the way of parsing github getAccessToken response (#1094)
* fix(github): fix the way of parsing Github getAccessToken response * fix(github): fix getAccessToken response mock
This commit is contained in:
parent
3925424316
commit
5516e18fe1
4 changed files with 28 additions and 12 deletions
|
@ -29,6 +29,7 @@
|
||||||
"@logto/schemas": "^0.1.0",
|
"@logto/schemas": "^0.1.0",
|
||||||
"@silverhand/essentials": "^1.1.0",
|
"@silverhand/essentials": "^1.1.0",
|
||||||
"got": "^11.8.2",
|
"got": "^11.8.2",
|
||||||
|
"query-string": "^7.0.1",
|
||||||
"zod": "^3.14.3"
|
"zod": "^3.14.3"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
|
|
|
@ -1,5 +1,6 @@
|
||||||
import { ConnectorError, ConnectorErrorCodes, GetConnectorConfig } from '@logto/connector-types';
|
import { ConnectorError, ConnectorErrorCodes, GetConnectorConfig } from '@logto/connector-types';
|
||||||
import nock from 'nock';
|
import nock from 'nock';
|
||||||
|
import * as qs from 'query-string';
|
||||||
|
|
||||||
import GithubConnector from '.';
|
import GithubConnector from '.';
|
||||||
import { accessTokenEndpoint, authorizationEndpoint, userInfoEndpoint } from './constant';
|
import { accessTokenEndpoint, authorizationEndpoint, userInfoEndpoint } from './constant';
|
||||||
|
@ -37,11 +38,16 @@ describe('getAccessToken', () => {
|
||||||
});
|
});
|
||||||
|
|
||||||
it('should get an accessToken by exchanging with code', async () => {
|
it('should get an accessToken by exchanging with code', async () => {
|
||||||
nock(accessTokenEndpoint).post('').reply(200, {
|
nock(accessTokenEndpoint)
|
||||||
access_token: 'access_token',
|
.post('')
|
||||||
scope: 'scope',
|
.reply(
|
||||||
token_type: 'token_type',
|
200,
|
||||||
});
|
qs.stringify({
|
||||||
|
access_token: 'access_token',
|
||||||
|
scope: 'scope',
|
||||||
|
token_type: 'token_type',
|
||||||
|
})
|
||||||
|
);
|
||||||
const { accessToken } = await githubMethods.getAccessToken('code');
|
const { accessToken } = await githubMethods.getAccessToken('code');
|
||||||
expect(accessToken).toEqual('access_token');
|
expect(accessToken).toEqual('access_token');
|
||||||
});
|
});
|
||||||
|
@ -49,7 +55,7 @@ describe('getAccessToken', () => {
|
||||||
it('throws SocialAuthCodeInvalid error if accessToken not found in response', async () => {
|
it('throws SocialAuthCodeInvalid error if accessToken not found in response', async () => {
|
||||||
nock(accessTokenEndpoint)
|
nock(accessTokenEndpoint)
|
||||||
.post('')
|
.post('')
|
||||||
.reply(200, { access_token: '', scope: 'scope', token_type: 'token_type' });
|
.reply(200, qs.stringify({ access_token: '', scope: 'scope', token_type: 'token_type' }));
|
||||||
await expect(githubMethods.getAccessToken('code')).rejects.toMatchError(
|
await expect(githubMethods.getAccessToken('code')).rejects.toMatchError(
|
||||||
new ConnectorError(ConnectorErrorCodes.SocialAuthCodeInvalid)
|
new ConnectorError(ConnectorErrorCodes.SocialAuthCodeInvalid)
|
||||||
);
|
);
|
||||||
|
@ -78,11 +84,16 @@ describe('validateConfig', () => {
|
||||||
|
|
||||||
describe('getUserInfo', () => {
|
describe('getUserInfo', () => {
|
||||||
beforeEach(() => {
|
beforeEach(() => {
|
||||||
nock(accessTokenEndpoint).post('').reply(200, {
|
nock(accessTokenEndpoint)
|
||||||
access_token: 'access_token',
|
.post('')
|
||||||
scope: 'scope',
|
.reply(
|
||||||
token_type: 'token_type',
|
200,
|
||||||
});
|
qs.stringify({
|
||||||
|
access_token: 'access_token',
|
||||||
|
scope: 'scope',
|
||||||
|
token_type: 'token_type',
|
||||||
|
})
|
||||||
|
);
|
||||||
});
|
});
|
||||||
|
|
||||||
afterEach(() => {
|
afterEach(() => {
|
||||||
|
|
|
@ -11,6 +11,7 @@ import {
|
||||||
} from '@logto/connector-types';
|
} from '@logto/connector-types';
|
||||||
import { assert, conditional } from '@silverhand/essentials';
|
import { assert, conditional } from '@silverhand/essentials';
|
||||||
import got, { RequestError as GotRequestError } from 'got';
|
import got, { RequestError as GotRequestError } from 'got';
|
||||||
|
import * as qs from 'query-string';
|
||||||
|
|
||||||
import {
|
import {
|
||||||
authorizationEndpoint,
|
authorizationEndpoint,
|
||||||
|
@ -68,7 +69,7 @@ export default class GithubConnector implements SocialConnector {
|
||||||
timeout: defaultTimeout,
|
timeout: defaultTimeout,
|
||||||
});
|
});
|
||||||
|
|
||||||
const result = accessTokenResponseGuard.safeParse(JSON.parse(httpResponse.body));
|
const result = accessTokenResponseGuard.safeParse(qs.parse(httpResponse.body));
|
||||||
|
|
||||||
if (!result.success) {
|
if (!result.success) {
|
||||||
throw new ConnectorError(ConnectorErrorCodes.InvalidResponse, result.error.message);
|
throw new ConnectorError(ConnectorErrorCodes.InvalidResponse, result.error.message);
|
||||||
|
@ -98,6 +99,7 @@ export default class GithubConnector implements SocialConnector {
|
||||||
if (!result.success) {
|
if (!result.success) {
|
||||||
throw new ConnectorError(ConnectorErrorCodes.InvalidResponse, result.error.message);
|
throw new ConnectorError(ConnectorErrorCodes.InvalidResponse, result.error.message);
|
||||||
}
|
}
|
||||||
|
|
||||||
const { id, avatar_url: avatar, email, name } = result.data;
|
const { id, avatar_url: avatar, email, name } = result.data;
|
||||||
|
|
||||||
return {
|
return {
|
||||||
|
|
|
@ -333,6 +333,7 @@ importers:
|
||||||
lint-staged: ^13.0.0
|
lint-staged: ^13.0.0
|
||||||
nock: ^13.2.2
|
nock: ^13.2.2
|
||||||
prettier: ^2.3.2
|
prettier: ^2.3.2
|
||||||
|
query-string: ^7.0.1
|
||||||
ts-jest: ^27.1.1
|
ts-jest: ^27.1.1
|
||||||
tsc-watch: ^5.0.0
|
tsc-watch: ^5.0.0
|
||||||
typescript: ^4.6.2
|
typescript: ^4.6.2
|
||||||
|
@ -344,6 +345,7 @@ importers:
|
||||||
'@silverhand/essentials': 1.1.7
|
'@silverhand/essentials': 1.1.7
|
||||||
'@silverhand/jest-config': 0.14.0_tgc6da2oqazvrn56dzwolsqo5i
|
'@silverhand/jest-config': 0.14.0_tgc6da2oqazvrn56dzwolsqo5i
|
||||||
got: 11.8.3
|
got: 11.8.3
|
||||||
|
query-string: 7.0.1
|
||||||
zod: 3.14.3
|
zod: 3.14.3
|
||||||
devDependencies:
|
devDependencies:
|
||||||
'@jest/types': 27.5.1
|
'@jest/types': 27.5.1
|
||||||
|
|
Loading…
Reference in a new issue