진행중인 프로젝트에서 사용할 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
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}');
}
}