카카오톡은 OpenID를 지원하지 않나요?

아마존 AWS의 Cognito에서 카카오톡 로그인 서비스를 연동하고자합니다.
그러기 위해서는 OpenID를 지원해야 하는데 카카오톡 개발 문서에는 그러한 내용을 찾지 못해서요.

아직 지원하고 있지 않다고 하면 앞으로도 지원할 계획은 없는건가요?

1개의 좋아요

@anon62503105 cognito 사이트를 통해 내용을 보아도 open id를 지원해야 연동이 된다는 상세 가이드 등을 찾지를 못했어요. 다른 social 로그인이 붙어 있다고는 하는데, 이렇게 AWS의 cognito에 다른 소셜 로그인을 연동하는 방법에 대해서는 내용을 못찾았어요. 카카오로그인의 경우 oauth2 spec을 준수하고 있고, 다른 소셜로그인도 비슷한 형식으로 알고 있는데요, 일단은 연동할 수 있는 내용을 알아야 답변을 드릴 수 있을것 같아요.

Cognito에서 문제가 되는 상황이라면
Hosted UI 기능을 쓰지 못하는 점입니다.

Cognito가 로그인 UI를 깔쌈하게 만들어 주는 기능인데.
OAuth 제공자 4개: 페북, 구글, 아마존, 애플
SAML2.0 그리고 OpenID Connect 제공자를 연동시킬 수 있습니다.

이 부분에 “카카오톡으로 로그인하기” 버튼을 넣어주고 싶어서, OpenID Connect 스펙을 만족하고 있는지 여쭙는 것입니다.

@binchoo

안녕하세요.

현재, 카카오 로그인은 OAuth2 기본 스펙으로 제공하고 있는데요.

OAuth 2.0 프로토콜의 확장이라 할수 있는 OIDC 스펙은 아직 적용되어 있지 않습니다.

내부적으로 준비는 되어 3월 14일 기능 오픈 예정입니다. (상황에 따라 변경될 수도 있습니다.)

참고 부탁드려요.

1개의 좋아요

OpenID Connect 기능이 개발되어 안내드립니다.

관련 내용은 아래 가이드를 참고해주세요.

SDK의 경우, OIDC 스펙이 적용된 아래 버전부터 사용할 수 있습니다.

  • JavaScript SDK: 1.41.2 이상
  • iOS SDK: 2.9.0 이상 (SDK V1 미지원)
  • Android SDK: 2.9.0 이상 (SDK V1 미지원)
  • Flutter SDK: 1.1.0 이상
2개의 좋아요

@tim.l @sophia.wings 님 감사합니다. 관련 기능 피드백을 받게되어 영광입니다.

현재 AWS Cognito User Pools의 OIDC 제공자로서 '카카오 로그인’을 설정해 보면서
아래와 같은 에러를 만나게 되었으므로 문의드립니다.

Response from jwks_uri cannot be parse as a JSON
image

[JWKS 스펙]
https://datatracker.ietf.org/doc/html/rfc7517#section-5

A JWK Set is a JSON object that represents a set of JWKs.  The JSON
   object MUST have a "keys" member, with its value being an array of
   JWKs.

[카카오 로그인 jwks]
https://kauth.kakao.com/.well-known/jwks.json
image

카카오 로그인 측 jwks 객체에 “keys” 배열이 없습니다. 이슈의 원인으로 의심되어 jwks 관련하여 확인 부탁드립니다.

2개의 좋아요

@binchoo

제보 감사합니다. jwks 응답에 표준 스펙에 맞는 응답으로 수정 후 적용되었습니다.

2개의 좋아요

@lars.1 님 대응해 주셔서 감사합니다!

일전 댓글에서 경험하던 jwks 관련 이슈는 해소되었습니다.

본인은 계속 Cognito와 연동을 진행해 보고 있습니다.
현재 ID 토큰에 담긴 aud 값에 의하여 오류를 경험하고 있어서 계속 문의드립니다.

[오류 내용]
Bad id_token aud [713059]

{"kid":"9f252dadd5f233f93d2fa528d12fea","typ":"JWT","alg":"RS256"}{"aud":"713059","sub":"2147572895","auth_time":1647921744,"iss":"https://kauth.kakao.com","exp":1647943344,"iat":1647921744}

현재 카카오 로그인이 내려준 ID 토큰에 aud 클레임이 713059처럼 "앱 ID"로 되어있는데요.

스펙 상 aud 값은 OAuth2.0의 client_id를 반드시 포함합니다.
따라서 단일 aud 형태라면 앱 ID가 아닌 REST API 키가 되어야 할 것으로 보입니다.

[OICD ID Token 스펙]
https://openid.net/specs/openid-connect-core-1_0.html#IDToken

aud
 Audience(s) that this ID Token is intended for. It MUST contain the OAuth 2.0 client_id of the Relying Party as an audience value.

[현재 카카오 로그인 ID Token 스펙]
image

1개의 좋아요

@binchoo

저희 쪽 에서 AWS Cognito에 카카오 OIDC 연동을 테스트 하여,
현재 스펙으로는 연동이 어려운 점 확인했고, aud를 client_id로 변경하도록 수정하였습니다.
AWS Cognito 설정에 대한 테스트는 진행해 보았으나,
실제 서비스로 연동이 잘 되는지 까지는 확인을 하지 못했는데요,
연동하시면서 이상한 부분이 확인 되시면 바로 제보 부탁드립니다.
감사합니다.

@lars.1 님 안녕하세요.
aud 관련 이슈 해결을 확인하였습니다! 감사합니다.

이후 Cognito와 매끄럽게 연계하는데 문제가 되는 부분은

OIDC의 UserInfo 엔드포인트로서 호환 응답을 내려주는
카카오 로그인 API가 있는지 여부입니다.

[UserInfo 응답 스펙]

  • UserInfo 응답은 UserInfo 클레임들을 멤버로 갖는 단일 JSON 객체.
  • UserInfo 응답은 sub 클레임을 반드시 포함. (이것을 Username으로 이용할 수 있습니다.)
  • JSON Serialization 방식으로 직렬화

등이 언급됩니다.

[사용자 정보 가져오기 응답의 문제]
사용자 정보 가져오기 API를 Userinfo 엔드포인트로 사용코자 했으나
응답 형식을 보니

  • sub 가 없고
  • 내부 객체에 유저 정보가 들어있어 애로사항이 있습니다.
{
    "id": Integer,
    "connected_at": String,
    "properties": {
        "nickname": String
    },
    "kakao_account": {
        "profile_nickname_needs_agreement": Boolean,
        "profile": {
            "nickname": String
        },
        "has_email": Boolean,
        "email_needs_agreement": Boolean,
        "is_email_valid": Boolean,
        "is_email_verified": Boolean,
        "email": String
    }
}

[객체 멤버로 인한 문제]
UserInfo 응답 내부에 다시 객체를 갖는 것은 JSON Serialization에 의해 허용되고 있으나
Cognito의 Attribute Mapping 에서 해당 값들을 뽑아내는 데엔 어려움이 따릅니다. 연관 이슈

혹여 jsonpath를 이용할 수 있을지 AWS에 문의하였습니다.
image

현 상황에서 카카오 로그인과 Cognito가 매끄럽게 통합되기 위해
본인이 기대하는 UserInfo 응답의 모습은 이러합니다.

{
  "sub": (Username으로 사용할만한 고유 식별값)
   "profile_nickname": String,
   "account_email": String,
   ...
}
1개의 좋아요

@binchoo

우선 id_token의 aud 관련하여 Cognito 연동 확인 감사드립니다.
sub 항목은 앱에 연결된 유저에게 발급된 id로,
KAPI의 사용자 정보 가져오기 요청 응답의 id와 같은 값 입니다.
$.id 로 맵핑이 불가능한지 확인 부탁드립니다.

1개의 좋아요

@lars.1
안타깝게도 AWS에서 OIDC 제공자에게서 Username을 반드시 sub 클레임에서 뽑도록 강제하고 있네요 ㅜ

[id → username 매핑 시도시]
image

[관련 정책]
https://docs.aws.amazon.com/cognito/latest/developerguide/cognito-user-pools-specifying-attribute-mapping.html
image

1개의 좋아요

@binchoo

붉은 글씨로 Cognito에서 jsonpath를 사용한 매핑이 불가능 하다고 말씀해 주셨네요.
관련하여 저희 쪽 에서도 조금 더 논의해 보고 추가 답변 드리도록 하겠습니다.

1개의 좋아요

안녕하세요, 댓글 쭉 읽어보면서 코그니토에 OIDC 를 붙여보려고 시도하는 중입니다.

@binchoo 님께서 작성하신걸 토대로 로그인을 붙여보려고 했지만 OIDC 의 포맷과 다른 필드때문인지 코그니토에서 email attribute 를 찾을수 없다고 에러를 반환하더라구요. (account_email 을 OIDC 의 커스텀 attribute 에 email 로 매핑했지만 안됩니다.)

혹시 관련해서 해결하신 방법이 있다면 공유 부탁드립니다.

@anon50189574

안녕하세요. aws Cognito에 카카오 v2/user/me 매핑 할 수 있도록 요청드렸는데요.

요청과 별개로
바로 사용할 수 있도록 신규 API준비중에 있습니다.
API 오픈일 정해지면 공지하도록 하겠습니다.

감사합니다.

1개의 좋아요

안녕하세요.

OIDC용, 별도 userinfo API를 제공하게되었습니다. 오늘 배포 되었으며,

다음과 같이 사용하실 수 있으며, 디벨로퍼스 Scope설정에 따라 제공 여부 결정됩니다.
(추가로, ".well-known/openid-configuration"도 제공 예정에 있으며, 오픈일 정해지면 다시 공유 드리겠습니다.)
감사합니다.

curl -v -X GET "https://kapi.kakao.com/v1/oidc/userinfo" \
  -H "Authorization: Bearer ${ACCESS_TOKEN}"
HTTP/ 1.1 200 OK
{
“sub”: 123456789,
“name”: “홍길동",
“nickname”: “홍길동",
“picture”: ""
“email”: "sample@sample.com",
“email_verified”: true,
“gender”: “MALE”,
“birthdate”: “1970-01-01”,
“phone_number”: “+82 00-0000-0000”,
“phone_number_verified”: true
}
4개의 좋아요

@anon50189574 @binchoo @anon62503105

안녕하세요.

OIDC Discovery 스펙 배포 되었습니다.

감사합니다.

https://kauth.kakao.com/.well-known/openid-configuration

{
    "issuer": "https://kauth.kakao.com",
    "authorization_endpoint": "https://kauth.kakao.com/oauth/authorize",
    "token_endpoint": "https://kauth.kakao.com/oauth/token",
    "userinfo_endpoint": "https://kapi.kakao.com/v1/oidc/userinfo",
    "jwks_uri": "https://kauth.kakao.com/.well-known/jwks.json",
    "subject_types_supported": ["public"],
    "id_token_signing_alg_values_supported": ["RS256"],
    "response_types_supported": ["code"],
    "grant_types_supported": ["authorization_code","refresh_token"],
    "code_challenge_methods_supported": ["S256"],
    "claims_supported": ["iss","aud","sub","auth_time","exp","iat","nonce"]
}
2개의 좋아요