Shopify Hma c Ошибка проверки - PullRequest
0 голосов
/ 14 января 2020

У меня проблема с моим приложением. Я разрабатываю приложение в node.js, пока вчера все работало правильно, сегодня оно не позволяет вам проходить аутентификацию ... в соответствии с тем, что мы находим, это то, что hma c отправляет shopify, с помощью которого оно создается из URL магазина + метка времени + секретный ключ. Пожалуйста, помогите ...

Это мой код, работающий до вчерашнего дня

signIn(
        hmac: string,
        shop: string,
        timestamp: string,
        code?: string,
    ): Promise<LoginUserDto> {
        return new Promise(
            (
                resolve: (result: LoginUserDto) => void,
                reject: (reason: ErrorResult) => void,
            ): void => {
                this.userRepository.getUserByEmail(shop).then((user: User) => {
                    if (!user) {
                        let userDto: CreateUserDto = {
                            shopUrl: shop,
                        };
                        let loginUserDto: LoginUserDto = {
                            newUser: true,
                            redirect: '',
                        };
                        const state = nonce();
                        const redirectUrl = redirectAddress;
                        const installUrl =
                            'https://' +
                            shop +
                            '/admin/oauth/authorize?client_id=' +
                            apiKey +
                            '&scope=' +
                            scopes +
                            '&state=' +
                            state +
                            '&redirect_uri=' +
                            redirectUrl;
                        loginUserDto.redirect = installUrl;
                        resolve(loginUserDto);
                    } else {
                        if (shop && hmac) {
                            let loginUserDto: LoginUserDto = user;
                            //Validate request is from Shopify
                            let query: any = {
                                shop: shop,
                                timestamp: timestamp,
                            };
                            const map = Object.assign({}, query);
                            const message = querystring.stringify(map);
                            const providedHmac = Buffer.from(hmac, 'utf-8');
                            const generatedHash = Buffer.from(
                                crypto
                                    .createHmac('sha256', apiSecret)
                                    .update(message)
                                    .digest('hex'),
                                'utf-8',
                            );
                            let hashEquals = false;

                            try {
                                hashEquals = crypto.timingSafeEqual(
                                    generatedHash,
                                    providedHmac,
                                );
                            } catch (e) {
                                hashEquals = false;
                            }

                            if (!hashEquals) {
                                console.log('hmac failed');
                                let loginUserDto: LoginUserDto = user;
                                loginUserDto.newUser = false;
                                loginUserDto.hmac = false;
                                loginUserDto.redirect =
                                    'https://' + shop + '/admin';
                                resolve(loginUserDto);
                            } else {
                                let loginUserDto: LoginUserDto = user;
                                loginUserDto.newUser = false;
                                loginUserDto.hmac = true;
                                resolve(loginUserDto);
                            }

                            const accessTokenRequestUrl =
                                'https://' + shop + '/admin/oauth/access_token';
                            const accessTokenPayload = {
                                client_id: apiKey,
                                client_secret: apiSecret,
                                code,
                            };
                        } else {
                            let loginUserDto: LoginUserDto = user;
                            loginUserDto.newUser = false;
                            loginUserDto.hmac = false;
                            loginUserDto.redirect =
                                'https://' + shop + '/admin/apps';
                            resolve(loginUserDto);
                        }
                        resolve(user);
                    }
                }); /*.catch((error) => {
                reject(new InternalServerErrorResult(ErrorCode.GeneralError, error));
            });*/
            },
        );
    }
...