-
Notifications
You must be signed in to change notification settings - Fork 2.1k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
feat(auth): add a default deviceName when remembering device #13022
Changes from all commits
1485390
38e6d54
ddfd5e2
fbe1997
c202b74
f00cd36
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,15 @@ | ||
// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. | ||
// SPDX-License-Identifier: Apache-2.0 | ||
|
||
import { getDeviceName as getDeviceNameNative } from '@aws-amplify/react-native'; | ||
|
||
/** | ||
* Retrieves the device name using name in ios and model in android, | ||
* | ||
* @returns {Promise<string>} A promise that resolves with a string representing the device name. | ||
* | ||
* Example Output: | ||
* ios: 'iPhone' / 'user's iPhone' | ||
* android: 'sdk_gphone64_arm64' | ||
*/ | ||
export const getDeviceName = async (): Promise<string> => getDeviceNameNative(); |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,52 @@ | ||
// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. | ||
// SPDX-License-Identifier: Apache-2.0 | ||
|
||
import { NavigatorUA } from './types'; | ||
/** | ||
* Retrieves the device name using the User-Agent Client Hints API if available, | ||
* falling back to the traditional userAgent string if not. | ||
* | ||
* @returns {Promise<string>} A promise that resolves with a string representing the device name. | ||
* | ||
* Example Output: | ||
* navigator.userAgentData: | ||
* 'macOS 14.2.1 arm macOS Not A(Brand/99.0.0.0;Google Chrome/121.0.6167.160;Chromium/121.0.6167.160' | ||
* navigator.userAgent: | ||
* 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:109.0) Gecko/20100101 Firefox/115.0' | ||
*/ | ||
export const getDeviceName = async (): Promise<string> => { | ||
const { userAgentData } = navigator as NavigatorUA; | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. userAgentData is experimental and hence isn't typed but is officially recommended by google. The support for
|
||
|
||
if (!userAgentData) return navigator.userAgent; | ||
|
||
const { | ||
platform = '', | ||
platformVersion = '', | ||
model = '', | ||
architecture = '', | ||
fullVersionList = [], | ||
} = await userAgentData.getHighEntropyValues([ | ||
'platform', | ||
'platformVersion', | ||
'architecture', | ||
'model', | ||
'fullVersionList', | ||
]); | ||
|
||
const versionList = fullVersionList | ||
.map((v: { brand: string; version: string }) => `${v.brand}/${v.version}`) | ||
.join(';'); | ||
|
||
const deviceName = [ | ||
platform, | ||
platformVersion, | ||
architecture, | ||
model, | ||
platform, | ||
versionList, | ||
] | ||
.filter(value => value) | ||
.join(' '); | ||
|
||
return deviceName; | ||
}; |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,4 @@ | ||
// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. | ||
// SPDX-License-Identifier: Apache-2.0 | ||
|
||
export { getDeviceName } from './getDeviceName'; |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,44 @@ | ||
// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. | ||
// SPDX-License-Identifier: Apache-2.0 | ||
|
||
// WICG Spec: https://wicg.github.io/ua-client-hints | ||
|
||
// https://wicg.github.io/ua-client-hints/#navigatorua | ||
export interface NavigatorUA { | ||
readonly userAgentData?: NavigatorUAData; | ||
} | ||
|
||
// https://wicg.github.io/ua-client-hints/#dictdef-navigatoruabrandversion | ||
interface NavigatorUABrandVersion { | ||
readonly brand: string; | ||
readonly version: string; | ||
} | ||
|
||
// https://wicg.github.io/ua-client-hints/#dictdef-uadatavalues | ||
interface UADataValues { | ||
readonly brands?: NavigatorUABrandVersion[]; | ||
readonly mobile?: boolean; | ||
readonly platform?: string; | ||
readonly architecture?: string; | ||
readonly bitness?: string; | ||
readonly formFactor?: string[]; | ||
readonly model?: string; | ||
readonly platformVersion?: string; | ||
/** @deprecated in favour of fullVersionList */ | ||
readonly uaFullVersion?: string; | ||
readonly fullVersionList?: NavigatorUABrandVersion[]; | ||
readonly wow64?: boolean; | ||
} | ||
|
||
// https://wicg.github.io/ua-client-hints/#dictdef-ualowentropyjson | ||
interface UALowEntropyJSON { | ||
readonly brands: NavigatorUABrandVersion[]; | ||
readonly mobile: boolean; | ||
readonly platform: string; | ||
} | ||
|
||
// https://wicg.github.io/ua-client-hints/#navigatoruadata | ||
interface NavigatorUAData extends UALowEntropyJSON { | ||
getHighEntropyValues(hints: string[]): Promise<UADataValues>; | ||
toJSON(): UALowEntropyJSON; | ||
} |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
is it needed to assert for this specific device name ?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
The deviceName is returned by the service call in
DeviceAttributes
on thedevice_name
attribute. We were doing the same in V5 as well