RESTAPI OAuth 2.0 token 발급 테스트

이재영·2024년 9월 22일

진행중인 프로젝트에서 사용할 FatSecret API를 사용하기 위해 우선적으로 사용자 토큰을 발급 유무 테스트 코드를 작성하였다.
Flutter oauth2 패키지가 존재하지만 FatSecret API의 토큰 발급 API를 한 번만 호출하는 간단한 테스트 코드이기 때문에, http 패키지만 사용하였다.

여지껏 API Key만 가지고 인증/권한 부여가 필요하지 않은 방식의 api 호출만 해보았고, 이번에 경험해본 Client Credentials Grant 방식은 처음이라 조금 낯설고, 쉽지 않긴 했다.. 다행이 api 호출 관련 매뉴얼은 fatsecret 문서에 잘 적혀있었다!

https://platform.fatsecret.com/docs/guides/authentication
https://platform.fatsecret.com/docs/guides/authentication/oauth2


짧게 정리해본 FatSecret API 호출 과정

1. 토큰 발급 요청: client_id와 client_secret을 이용하여 FatSecret 인증 서버에 토큰 발급을 요청한다
2. 토큰 발급: 인증 서버는 요청을 확인하고 유효한 요청이면 access_token을 발급한다
3. API 호출: 발급받은 access_token을 HTTP 헤더에 포함하여 FatSecret API를 호출한다
4. 응답: FatSecret API 서버는 access_token을 검증하여 유효하면 요청된 데이터를 응답한다


테스트 코드

import 'package:http/http.dart' as http;
import 'dart:convert';

Future<void> main() async {
  // FatSecret API Credentials
  const String clientId = 'YOUR_CLIENT_ID'; // 실제 Client ID로 변경
  const String clientSecret = 'YOUR_CLIENT_SECRET'; // 실제 Client Secret으로 변경

  // OAuth 2.0 Token Endpoint
  const String tokenUrl = 'https://oauth.fatsecret.com/connect/token';

  // Request Body
  final Map<String, String> body = {
    'grant_type': 'client_credentials',
    'client_id': clientId,
    'client_secret': clientSecret,
    'scope': 'basic', // 필요한 scope으로 변경 가능
  };

  // HTTP POST 요청 전송
  final response = await http.post(
    Uri.parse(tokenUrl),
    headers: {'Content-Type': 'application/x-www-form-urlencoded'},
    body: body,
  );

  // 응답 확인
  if (response.statusCode == 200) {
    // 토큰 발급 성공
    final Map<String, dynamic> jsonResponse = json.decode(response.body);
    final String accessToken = jsonResponse['access_token'];
    print('Access Token: $accessToken');
    // TODO: 발급된 accessToken을 사용하여 다른 API 호출 테스트
  } else {
    // 토큰 발급 실패
    print('Error: ${response.statusCode}');
    print('Response Body: ${response.body}');
  }
}
profile
how to define. how to solve.

0개의 댓글