{"action":"created","issue":{"url":"https://api.github.com/repos/nextcloud/server/issues/1108","repository_url":"https://api.github.com/repos/nextcloud/server","labels_url":"https://api.github.com/repos/nextcloud/server/issues/1108/labels{/name}","comments_url":"https://api.github.com/repos/nextcloud/server/issues/1108/comments","events_url":"https://api.github.com/repos/nextcloud/server/issues/1108/events","html_url":"https://github.com/nextcloud/server/issues/1108","id":173642038,"number":1108,"title":"2FA: let users create and authenticate via backup codes","user":{"login":"ChristophWurst","id":1374172,"avatar_url":"https://avatars.githubusercontent.com/u/1374172?v=3","gravatar_id":"","url":"https://api.github.com/users/ChristophWurst","html_url":"https://github.com/ChristophWurst","followers_url":"https://api.github.com/users/ChristophWurst/followers","following_url":"https://api.github.com/users/ChristophWurst/following{/other_user}","gists_url":"https://api.github.com/users/ChristophWurst/gists{/gist_id}","starred_url":"https://api.github.com/users/ChristophWurst/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/ChristophWurst/subscriptions","organizations_url":"https://api.github.com/users/ChristophWurst/orgs","repos_url":"https://api.github.com/users/ChristophWurst/repos","events_url":"https://api.github.com/users/ChristophWurst/events{/privacy}","received_events_url":"https://api.github.com/users/ChristophWurst/received_events","type":"User","site_admin":false},"labels":[{"url":"https://api.github.com/repos/nextcloud/server/labels/2.%20developing","name":"2. developing","color":"0052cc"},{"url":"https://api.github.com/repos/nextcloud/server/labels/enhancement","name":"enhancement","color":"0e8a16"}],"state":"closed","locked":false,"assignee":{"login":"LukasReschke","id":878997,"avatar_url":"https://avatars.githubusercontent.com/u/878997?v=3","gravatar_id":"","url":"https://api.github.com/users/LukasReschke","html_url":"https://github.com/LukasReschke","followers_url":"https://api.github.com/users/LukasReschke/followers","following_url":"https://api.github.com/users/LukasReschke/following{/other_user}","gists_url":"https://api.github.com/users/LukasReschke/gists{/gist_id}","starred_url":"https://api.github.com/users/LukasReschke/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/LukasReschke/subscriptions","organizations_url":"https://api.github.com/users/LukasReschke/orgs","repos_url":"https://api.github.com/users/LukasReschke/repos","events_url":"https://api.github.com/users/LukasReschke/events{/privacy}","received_events_url":"https://api.github.com/users/LukasReschke/received_events","type":"User","site_admin":false},"assignees":[{"login":"LukasReschke","id":878997,"avatar_url":"https://avatars.githubusercontent.com/u/878997?v=3","gravatar_id":"","url":"https://api.github.com/users/LukasReschke","html_url":"https://github.com/LukasReschke","followers_url":"https://api.github.com/users/LukasReschke/followers","following_url":"https://api.github.com/users/LukasReschke/following{/other_user}","gists_url":"https://api.github.com/users/LukasReschke/gists{/gist_id}","starred_url":"https://api.github.com/users/LukasReschke/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/LukasReschke/subscriptions","organizations_url":"https://api.github.com/users/LukasReschke/orgs","repos_url":"https://api.github.com/users/LukasReschke/repos","events_url":"https://api.github.com/users/LukasReschke/events{/privacy}","received_events_url":"https://api.github.com/users/LukasReschke/received_events","type":"User","site_admin":false},{"login":"jancborchardt","id":925062,"avatar_url":"https://avatars.githubusercontent.com/u/925062?v=3","gravatar_id":"","url":"https://api.github.com/users/jancborchardt","html_url":"https://github.com/jancborchardt","followers_url":"https://api.github.com/users/jancborchardt/followers","following_url":"https://api.github.com/users/jancborchardt/following{/other_user}","gists_url":"https://api.github.com/users/jancborchardt/gists{/gist_id}","starred_url":"https://api.github.com/users/jancborchardt/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/jancborchardt/subscriptions","organizations_url":"https://api.github.com/users/jancborchardt/orgs","repos_url":"https://api.github.com/users/jancborchardt/repos","events_url":"https://api.github.com/users/jancborchardt/events{/privacy}","received_events_url":"https://api.github.com/users/jancborchardt/received_events","type":"User","site_admin":false},{"login":"ChristophWurst","id":1374172,"avatar_url":"https://avatars.githubusercontent.com/u/1374172?v=3","gravatar_id":"","url":"https://api.github.com/users/ChristophWurst","html_url":"https://github.com/ChristophWurst","followers_url":"https://api.github.com/users/ChristophWurst/followers","following_url":"https://api.github.com/users/ChristophWurst/following{/other_user}","gists_url":"https://api.github.com/users/ChristophWurst/gists{/gist_id}","starred_url":"https://api.github.com/users/ChristophWurst/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/ChristophWurst/subscriptions","organizations_url":"https://api.github.com/users/ChristophWurst/orgs","repos_url":"https://api.github.com/users/ChristophWurst/repos","events_url":"https://api.github.com/users/ChristophWurst/events{/privacy}","received_events_url":"https://api.github.com/users/ChristophWurst/received_events","type":"User","site_admin":false}],"milestone":{"url":"https://api.github.com/repos/nextcloud/server/milestones/6","html_url":"https://github.com/nextcloud/server/milestones/Nextcloud%2011.0","labels_url":"https://api.github.com/repos/nextcloud/server/milestones/6/labels","id":1896997,"number":6,"title":"Nextcloud 11.0","description":null,"creator":{"login":"MorrisJobke","id":245432,"avatar_url":"https://avatars.githubusercontent.com/u/245432?v=3","gravatar_id":"","url":"https://api.github.com/users/MorrisJobke","html_url":"https://github.com/MorrisJobke","followers_url":"https://api.github.com/users/MorrisJobke/followers","following_url":"https://api.github.com/users/MorrisJobke/following{/other_user}","gists_url":"https://api.github.com/users/MorrisJobke/gists{/gist_id}","starred_url":"https://api.github.com/users/MorrisJobke/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/MorrisJobke/subscriptions","organizations_url":"https://api.github.com/users/MorrisJobke/orgs","repos_url":"https://api.github.com/users/MorrisJobke/repos","events_url":"https://api.github.com/users/MorrisJobke/events{/privacy}","received_events_url":"https://api.github.com/users/MorrisJobke/received_events","type":"User","site_admin":false},"open_issues":85,"closed_issues":320,"state":"open","created_at":"2016-07-21T15:58:16Z","updated_at":"2016-09-05T12:16:45Z","due_on":null,"closed_at":null},"comments":2,"created_at":"2016-08-28T11:35:06Z","updated_at":"2016-09-05T12:20:17Z","closed_at":"2016-09-05T10:17:30Z","body":"Platforms like GitHub allow users to create backup codes, which they can use to log into their account in case they loose access to their second factor (e.g. phone lost/damaged). Those codes can only be used once.\r\n\r\nAs reported by @mar1u5 in https://github.com/ChristophWurst/twofactor_totp/issues/27 it would be a nice enhancement if you could provide the same backup mechanism for any 2FA providers.\r\n\r\nI have created a simpe 2FA provider app that enabled that exact functionality, see https://github.com/ChristophWurst/twofactor_backupcodes. It basically creates 10 codes that are hashed and stored to the db. User are then able to solve the 2FA challenge of that provider once with each code. Users can re-generate backup codes at any time, which will also delete older backup codes.\r\n\r\nTo have a nice, integrated solution I'd like to propose the integration of this provider into the nextcloud server. The provider should always be enabled, regardless of the users having 2FA enabled or not. This provider's challenge should only be used if at least one other 2FA provider is enabled for a user. The backup code provider should not be listed like other providers, but should be a link on the bottom next to the \"Cancel log in\" link. Something like \"Use backup code\".\r\n\r\ncc @nextcloud/security\r\ncc @LukasReschke @jancborchardt as discussed"},"comment":{"url":"https://api.github.com/repos/nextcloud/server/issues/comments/244733950","html_url":"https://github.com/nextcloud/server/issues/1108#issuecomment-244733950","issue_url":"https://api.github.com/repos/nextcloud/server/issues/1108","id":244733950,"user":{"login":"juliushaertl","id":3404133,"avatar_url":"https://avatars.githubusercontent.com/u/3404133?v=3","gravatar_id":"","url":"https://api.github.com/users/juliushaertl","html_url":"https://github.com/juliushaertl","followers_url":"https://api.github.com/users/juliushaertl/followers","following_url":"https://api.github.com/users/juliushaertl/following{/other_user}","gists_url":"https://api.github.com/users/juliushaertl/gists{/gist_id}","starred_url":"https://api.github.com/users/juliushaertl/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/juliushaertl/subscriptions","organizations_url":"https://api.github.com/users/juliushaertl/orgs","repos_url":"https://api.github.com/users/juliushaertl/repos","events_url":"https://api.github.com/users/juliushaertl/events{/privacy}","received_events_url":"https://api.github.com/users/juliushaertl/received_events","type":"User","site_admin":false},"created_at":"2016-09-05T12:20:17Z","updated_at":"2016-09-05T12:20:17Z","body":"guuHallzz\n\n.z\n\n"}}
{"actor":{"display_login":"juliushaertl"}}