OneSignal은 사용자 사칭을 방지하는 데 도움이 되는 신원 확인이라는 향상된 보안 기능을 제공합니다. 이 기능은 서버에서 안전하게 생성되는 JSON Web Token(또는 JWT)을 사용합니다. 구독 정보를 확인하기 위해 이러한 토큰이 앱과 OneSignal의 API로 전달됩니다.신원 확인을 활성화하여 보호할 항목:
사용자 로그인
이메일 구독 추가
SMS 구독 추가
사용자 신원 수정
신원 확인은 현재 베타 버전입니다. 계정에서 활성화하려면 support@onesignal.com에 문의하세요. 지원팀이 활성화하면 대시보드에서 활성화할 수 있습니다(5단계 참조).
항상 키 관리 시스템과 같은 안전한 환경에 개인 키를 저장하세요. 클라이언트 측 코드, 공개 저장소 또는 로그에 개인 키를 절대 노출하지 마세요.
2
백엔드에서 확인 JWT 생성
신원 확인을 위해서는 OneSignal에 로그인하기 전에 인증 서버로 최종 사용자를 인증해야 합니다. 최종 사용자가 백엔드로 인증하면 토큰을 생성하고 기기로의 인증 응답에 포함시킵니다. 앱이 백엔드 서버를 실행하지 않는 경우 사용자를 확인하고 이러한 토큰을 생성하기 위한 경량 서버 설정을 고려하세요.
ES256 알고리즘을 사용하여 JWT에 서명합니다. JWT를 OneSignal로 전송할 때 확인 문제를 방지하려면 백엔드가 이 서명 방법을 사용하도록 구성되어 있는지 확인하세요. 이를 위해 JWT 라이브러리를 사용하는 것이 좋습니다.jsonwebtoken을 사용하는 예제:
import jwt from 'jsonwebtoken';const APP_ID = process.env['ONESIGNAL_APP_ID']const IDENTITY_VERIFICATION_SECRET = process.env['ONESIGNAL_IDENTITY_VERIFICATION_SECRET_KEY']// Generates JWT, potentially with subscription claims, for the user identified by the External IDfunction signOneSignalJWT(externalId, subscriptions) {return jwt.sign({iss: APP_ID,exp: Math.floor(Date.now() / 1000) + 3600, // 1-hour expirationidentity: {'external_id': externalId,},subscriptions},IDENTITY_VERIFICATION_SECRET,{ algorithm: 'ES256' });}// Pass this token to your mobile app to use with the `login` SDK methodconst onesignalJWT = signOneSignalJWT('EXTERNAL_ID');
이상적으로는 사용자 로그인 시 이메일 또는 전화번호와 같은 구독 세부 정보가 JWT 페이로드에 포함됩니다. 이러한 세부 정보를 미리 사용할 수 없는 경우 확인 서버는 구독 정보를 사용할 수 있게 되면 토큰을 동적으로 생성하는 엔드포인트를 제공해야 합니다.예제: 구독을 추가하기 위한 JWT 생성
토큰 무효화와 같은 시나리오를 처리하기 위해 백엔드에 전용 엔드포인트를 구현해야 합니다. 이 엔드포인트는 OneSignal이 업데이트를 요청할 때 새로고침된 JWT를 제공해야 합니다.토큰 무효화 처리 및 JWT 새로고침 예제:
OneSignal.addUserJwtInvalidatedListener(event -> { // Get the expired user's External ID String externalId = event.getExternalId(); // Fetch a new JWT from your backend for the user String onesignalJWT = "yourUpdatedToken"; // Provide the new JWT to the SDK OneSignal.updateUserJwt(externalId, onesignalJWT);});
OneSignal.addUserJwtInvalidatedListener( object : IUserJwtInvalidatedListener { override fun onUserJwtInvalidated(event: UserJwtInvalidatedEvent) { val externalId = event.externalId val onesignalJWT = "" updateUserJwt(externalId, onesignalJWT) } },)
class AppDelegate: UIResponder, UIApplicationDelegate, OSUserJwtInvalidatedListener { func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]? = nil) -> Bool { // Set self to listen for JWT invalidated events OneSignal.addUserJwtInvalidatedListener(self) // Remove the JWT listener as needed by calling: // `OneSignal.removeUserJwtInvalidatedListener(self)` } // Required to conform to `OSUserJwtInvalidatedListener` protocol func onUserJwtInvalidated(event: OneSignalUser.OSUserJwtInvalidatedEvent) { // Get the expired user's External ID let externalId = event.externalId // Fetch a new JWT from your backend for the user let onesignalJWT = "yourUpdatedToken" // Provide the new JWT to the SDK OneSignal.updateUserJwt(externalId: externalId, token: onesignalJWT) }}
@interface MyListener: NSObject<OSUserJwtInvalidatedListener>@end@implementation MyListener- (void)onUserJwtInvalidatedWithEvent:(OSUserJwtInvalidatedEvent * _Nonnull)event { // Get the expired user's External ID NSString *externalId = event.externalId; // Fetch a new JWT from your backend for the user NSString *onesignalJWT = @"yourUpdatedToken"; // Provide the new JWT to the SDK [OneSignal updateUserJwt:externalId withToken:onesignalJWT];}// Add or remove your User Jwt Invalidated Listener[OneSignal addUserJwtInvalidatedListener:myListener];[OneSignal removeUserJwtInvalidatedListener:myListener];
이를 통해 사용자의 JWT가 무효화되면 백엔드에서 새 JWT를 가져와 OneSignal로 전달할 수 있습니다. 인증 중에 생성된 토큰에 이메일 및 전화번호가 포함되지 않은 경우 이 기능을 사용하여 이메일 및 SMS 구독을 관리할 수 있도록 이메일 및 전화번호가 포함된 토큰을 생성할 수도 있습니다.
5
대시보드에서 토큰 신원 확인 활성화
설정 > 키 및 ID에서 토큰 신원 확인을 토글하여 활성화합니다.
활성화되면 앱은 구독 진위 여부를 확인하기 위해 OneSignal JWT를 전송해야 합니다. 또한 앱은 신원 확인 토큰 서버에서 생성된 JWT를 사용하여 login 메서드를 호출해야 합니다.
모바일 앱에서 구독을 추가하기 위해 추가 단계를 수행할 필요가 없습니다. 로그인 메서드를 호출하면 자동으로 처리됩니다.
이메일 추가
전화번호 추가
OneSignal.getUser().addEmail(emailAddress);
OneSignal.getUser().addEmail(emailAddress)
// If you have not already included it in your JWT token, update the JWT with the emaillet onesignalJWT = "newTokenThatContainsTheEmailToAdd"OneSignal.updateUserJwt(externalId: externalId, token: onesignalJWT)// Add the emailOneSignal.User.addEmail(emailAddress)
// If you have not already included it in your JWT token, update the JWT with the emailNSString *onesignalJWT = @"newTokenThatContainsTheEmailToAdd";[OneSignal updateUserJwt:externalId withToken:onesignalJWT];// Add the email[OneSignal.User addEmail:emailAddress];
OneSignal.getUser().addSms(smsNumber);
OneSignal.getUser().addSms(smsNumber)
// If you have not already included it in your JWT token, update the JWT with the smslet onesignalJWT = "newTokenThatContainsTheSmsToAdd"OneSignal.updateUserJwt(externalId: externalId, token: onesignalJWT)// Add the sms numberOneSignal.User.addSms(smsNumber)
// If you have not already included it in your JWT token, update the JWT with the smsNSString *onesignalJWT = @"newTokenThatContainsTheSmsToAdd";[OneSignal updateUserJwt:externalId withToken:onesignalJWT];// Add the sms number[OneSignal.User addSms:smsNumber];